

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon DynamoDB：運作方式
<a name="HowItWorks"></a>

下列各節提供 Amazon DynamoDB 服務元件及其互動方式概觀。

**Topics**
+ [DynamoDB 速查表](CheatSheet.md)
+ [Amazon DynamoDB 的核心元件](HowItWorks.CoreComponents.md)
+ [DynamoDB API](HowItWorks.API.md)
+ [Amazon DynamoDB 中支援的資料類型和命名規則](HowItWorks.NamingRulesDataTypes.md)
+ [DynamoDB 資料表類別](HowItWorks.TableClasses.md)
+ [DynamoDB 的分割區與資料分配](HowItWorks.Partitions.md)
+ [了解如何從 SQL 過渡到 NoSQL](SQLtoNoSQL.md)
+ [Amazon DynamoDB 學習資源與工具](AdditionalResources.md)

# DynamoDB 速查表
<a name="CheatSheet"></a>

此備忘單提供使用 Amazon DynamoDB 及其各種 AWS SDKs快速參考。

## 初始 設定
<a name="CheatSheet.InitialSetup"></a>

1. [註冊。 AWS](SettingUp.DynamoWebService.html#SettingUp.DynamoWebService.SignUpForAWS)

1. [取得 AWS 存取金鑰](SettingUp.DynamoWebService.html#SettingUp.DynamoWebService.GetCredentials)，以程式設計方式存取 DynamoDB。

1. [設定您 DynamoDB 憑證](SettingUp.DynamoWebService.html#SettingUp.DynamoWebService.ConfigureCredentials)。

**另請參閱:**
+ [設定 DynamoDB (Web 服務)](SettingUp.DynamoWebService.html)
+ [DynamoDB 入門](GettingStartedDynamoDB.html)
+ [核心元件的基本概述](HowItWorks.CoreComponents.html)

 

## SDK 或 CLI
<a name="CheatSheet.Platform"></a>

選擇您偏好的 [SDK](sdk-general-information-section.html)，或設定 [AWS CLI](/cli/latest/index.html)。

**注意**  
當您 AWS CLI 在 Windows 上使用 時，不在引號內的反斜線 (\$1) 會被視為歸位字元。此外，您必須逸出其他引號內的任何引號和大括號。如需範例，請參閱下一章節「建立資料表」的 **Windows** 標籤。

**另請參閱:**
+ [AWS CLI 搭配 DynamoDB](Tools.CLI.html)
+ [DynamoDB 入門 - 步驟 2](getting-started-step-2.html)

## 基本動作
<a name="CheatSheet.BasicActions"></a>

本節提供基本 DynamoDB 任務的程式碼。如需這些任務的詳細資訊，請參閱 [ DynamoDB 和 AWS SDKs 入門](GettingStarted.html)。

### 建立資料表
<a name="CheatSheet.BasicActions.CreateTable"></a>

------
#### [ Default ]

```
aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
    --billing-mode PAY_PER_REQUEST \
    --table-class STANDARD
```

------
#### [ Windows ]

```
aws dynamodb create-table ^
    --table-name Music ^
    --attribute-definitions ^
        AttributeName=Artist,AttributeType=S ^
        AttributeName=SongTitle,AttributeType=S ^
    --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE ^
    --billing-mode PAY_PER_REQUEST ^
    --table-class STANDARD
```

------

### 將項目寫入資料表
<a name="CheatSheet.BasicActions.WriteItem"></a>

```
aws dynamodb put-item \ --table-name Music \ --item file://item.json
```

### 從資料表讀取項目
<a name="CheatSheet.BasicActions.ReadItem"></a>

```
aws dynamodb get-item \ --table-name Music \ --item file://item.json
```

### 從資料表刪除項目
<a name="CheatSheet.BasicActions.DeleteItem"></a>

```
aws dynamodb delete-item --table-name Music --key file://key.json
```

### 查詢資料表
<a name="CheatSheet.BasicActions.QueryTable"></a>

```
aws dynamodb query --table-name Music 
--key-condition-expression "ArtistName=:Artist and SongName=:Songtitle"
```

### 刪除資料表
<a name="CheatSheet.BasicActions.DeleteTable"></a>

```
aws dynamodb delete-table --table-name Music
```

### 列出資料表名稱
<a name="CheatSheet.BasicActions.ListTableNames"></a>

```
aws dynamodb list-tables
```

## 命名規則
<a name="CheatSheet.NamingRules"></a>
+ 所有名稱都必須使用 UTF-8 編碼並區分大小寫。
+ 資料表名稱與索引名稱長度必須介於 3 到 255 個字元之間，而且只能包含下列字元：
  + `a-z`
  + `A-Z`
  + `0-9`
  + `_` (底線)
  + `-` (連字號)
  + `.` (點號)
+ 屬性名稱至少必須為一個字元長，而且大小不能超過 64KB。

如需詳細資訊，請參閱[命名規則](HowItWorks.NamingRulesDataTypes.html)。

## 服務配額基本概念
<a name="CheatSheet.ServiceBasics"></a>

**讀取和寫入單位**
+ **讀取容量單位 (RCU)** – 每秒一個高度一致性讀取，或每秒兩個最終一致讀取，適用於大小上限為 4 KB 的項目。
+ **寫入容量單位 (WCU)** – 每秒一個寫入，適用於大小上限為 1 KB 的項目。

**資料表限制**
+ **資料表大小** – 資料表大小沒有任何實際限制。就項目數或位元組數而言，資料表是沒有限制的。
+ **資料表數量** – 對於任何 AWS 帳戶，每個 AWS 區域的初始配額為 2，500 個資料表。
+ **查詢和掃描的頁面大小限制** – 每個查詢或掃描的每頁限制為 1 MB。若您在資料表上的查詢參數或掃描操作產生超過 1 MB 的資料，DynamoDB 會傳回初始相符項目。同時也會傳回一個 `LastEvaluatedKey` 屬性，您可以在新的請求中使用該屬性來讀取下一頁。

**索引**
+ **本機次要索引 (LSI)** – 您可以定義最多五個本機次要索引。當索引必須與基礎資料表保持高度一致時，LSI 就特別有用。
+ **全域次要索引 (GSIs)** – 每個資料表有 20 個全域次要索引的預設配額。
+ **每份資料表投影次要索引屬性** – 您最多可以投影 100 個屬性到資料表所有的區域和全域次要索引。這只適用於使用者指定的投影屬性。

**分割區索引鍵**
+ 分割區索引鍵值的長度下限為 1 個位元組。長度上限為 2048 個位元組。
+ 資料表或次要索引中，不同的分割區索引鍵值數目沒有實際限制。
+ 排序索引鍵值的長度下限為 1 個位元組。長度上限為 1024 個位元組。
+ 一般而言，每個分割區索引鍵值的相異排序索引鍵值數目沒有實際限制。例外狀況是有次要索引的資料表。

如需次要索引、分割區索引鍵設計和排序索引鍵設計的詳細資訊，請參閱[最佳實務](best-practices.html)。

**常用資料類型限制**
+ **String** (字串) – 字串長度受到項目大小上限 400 KB 的限制。字串是 UTF-8 二進位編碼的 Unicode。
+ **數字** – 數字的精準度最多可達 38 位數，可為正數、負數或零。
+ **二進位** – 二進位長度受到項目大小上限 400 KB 的限制。使用二進制屬性的應用程式必須先以 base64 編碼資料，再傳送到 DynamoDB。

如需支援的完整資料類型清單，請參閱[資料類型](HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes)。如需詳細資訊，請參閱[服務配額](ServiceQuotas.html#limits-items)。

### 項目、屬性和表達式參數
<a name="CheatSheet.ServiceBasics.Misc"></a>

DynamoDB 的項目大小上限是 400 KB，包括屬性名稱二進位長度 (UTF-8 長度) 和屬性值二進位長度 (UTF-8 長度)。屬性名稱算作大小限制的一部分。

清單、映射或集合中值數目不限，只要含有值的項目符合 400 KB 項目大小限制。

針對表達式參數，任何表達式字串的長度上限為 4 KB。

如需項目大小、屬性和表達式參數的詳細資訊，請參閱[服務配額](ServiceQuotas.html#limits-items)。

## 其他資訊
<a name="CheatSheet.FurtherInfo"></a>
+ [安全性](security.html)
+ [監控和記錄](monitoring.html)
+ [使用串流](streamsmain.html)
+ [備份](Backup-and-Restore.html)和[時間點復原](Point-in-time-recovery.html)
+ [與其他 AWS 服務整合](OtherServices.html) 
+ [API 參考](/amazondynamodb/latest/APIReference/Welcome.html)
+ [架構中心：資料庫最佳實務](https://aws.amazon.com/architecture/databases/)
+ [教學課程影片](https://youtu.be/Mw8wCj0gkRc)
+ [DynamoDB 論壇](https://repost.aws/search/questions?globalSearch=dynamodb)

# Amazon DynamoDB 的核心元件
<a name="HowItWorks.CoreComponents"></a>

在 DynamoDB 中，資料表、項目與屬性都是您會用到的核心元件。*資料表*是*項目*的集合，而每個項目則是*屬性*的集合。DynamoDB 使用主索引鍵來唯一識別資料表中的每個項目。您可以使用 DynamoDB Streams 來擷取 DynamoDB 資料表中的資料修改事件。

 DynamoDB 中有其限制。如需詳細資訊，請參閱[Amazon DynamoDB 中的配額](ServiceQuotas.md)。

以下影片將為您介紹資料表、項目與屬性。

[資料表、項目與屬性](https://www.youtube.com/embed/Mw8wCj0gkRc)

## 資料表、項目與屬性
<a name="HowItWorks.CoreComponents.TablesItemsAttributes"></a>

![\[每個 DynamoDB 資料表可包含零個或多個項目，每個項目由一個或多個屬性組成。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/HowItWorksTables-2024.png)


以下是基本 DynamoDB 元件：
+ **資料表**：與其他資料庫系統類似，DynamoDB 會將資料存放在資料表中。*資料表*是資料的集合。例如，您可以使用名為 *People* 的資料表範例，來存放朋友、家人或其他任何人的相關個人聯絡資訊。您也可以使用 *Cars* 資料表來存放各人駕駛之車輛的相關資訊。
+ **項目**：每個資料表包含零或多個項目。*項目*是可從所有其他項目唯一識別的一組屬性。在 *People* 資料表中，每個項目代表一個人。在 *Cars* 資料表中，每個項目代表一輛車。DynamoDB 中的項目與其他資料庫系統中的資料列、紀錄或元組有許多相似之處。在 DynamoDB 中，可以存放在資料表中的項目數不限。
+ **屬性**：每個項目是由一或多個屬性所組成。*屬性*是一種基本資料元素，不必再進一步細分。例如，*People* 資料表中的項目包含名為 *PersonID*、*LastName*、*FirstName* 等屬性。在 *Department* 資料表中，項目可能會有 *DepartmentID*、*Name*、*Manager* 等屬性。DynamoDB 中的屬性與其他資料庫系統中的欄位或資料行有許多相似之處。

下圖顯示一個名為 *People* 的資料表，其中包含一些範例項目與屬性。

```
People

{
    "PersonID": 101,
    "LastName": "Smith",
    "FirstName": "Fred",
    "Phone": "555-4321"
}

{
    "PersonID": 102,
    "LastName": "Jones",
    "FirstName": "Mary",
    "Address": {
                "Street": "123 Main",
                "City": "Anytown",
                "State": "OH",
                "ZIPCode": 12345
    }
}

{
    "PersonID": 103,
    "LastName": "Stephens",
    "FirstName": "Howard",
    "Address": {
                "Street": "123 Main",
                "City": "London",                                    
                "PostalCode": "ER3 5K8"
    },
    "FavoriteColor": "Blue"
}
```

*People* 資料表的注意事項如下：
+ 資料表中的每個項目都有唯一識別符或主索引鍵，可區分該項目與資料表中的所有其他項目。在 *People* 資料表中，主索引鍵是由一個屬性 (*PersonID*) 所組成。
+ 除了主索引鍵之外，*People* 資料表沒有結構描述，這表示您不需要事先定義屬性或其資料類型。每個項目可以有其專屬的不同屬性。
+ 大多數屬性為*純量*，亦即只能有一個值。字串與數字是常見的純量範例。
+ 有些項目有巢狀屬性 (*Address*)。DynamoDB 支援巢狀屬性，最多 32 層深。

以下是另一個名為 *Music* 的範例資料表，您可以用來追蹤音樂收藏。

```
Music

{
    "Artist": "No One You Know",
    "SongTitle": "My Dog Spot",
    "AlbumTitle": "Hey Now",
    "Price": 1.98,
    "Genre": "Country",
    "CriticRating": 8.4
}

{
    "Artist": "No One You Know",
    "SongTitle": "Somewhere Down The Road",
    "AlbumTitle": "Somewhat Famous",
    "Genre": "Country",
    "CriticRating": 8.4,
    "Year": 1984
}

{
    "Artist": "The Acme Band",
    "SongTitle": "Still in Love",
    "AlbumTitle": "The Buck Starts Here",
    "Price": 2.47,
    "Genre": "Rock",
    "PromotionInfo": {
        "RadioStationsPlaying": [
            "KHCR",
            "KQBX",
            "WTNR",
            "WJJH"
        ],
        "TourDates": {
            "Seattle": "20150622",
            "Cleveland": "20150630"
        },
        "Rotation": "Heavy"
    }
}

{
    "Artist": "The Acme Band",
    "SongTitle": "Look Out, World",
    "AlbumTitle": "The Buck Starts Here",
    "Price": 0.99,
    "Genre": "Rock"
}
```

*Music* 資料表的注意事項如下：
+ *Music* 的主索引鍵是由兩個屬性 (*Artist* 與 *SongTitle*) 所組成。資料表中的每個項目必須有這兩個屬性。*Artist* 與 *SongTitle* 的組合可區分資料表中的每個項目與所有其他項目。
+ 除了主索引鍵之外，*Music* 資料表沒有結構描述，這表示您不需要事先定義屬性或其資料類型。每個項目可以有其專屬的不同屬性。
+ 其中一個項目有巢狀屬性 (*PromotionInfo*)，包含其他的巢狀屬性。DynamoDB 支援巢狀屬性，最多 32 層深。

 如需詳細資訊，請參閱 [在 DynamoDB 中使用資料表和資料](WorkingWithTables.md)。

## 主索引鍵
<a name="HowItWorks.CoreComponents.PrimaryKey"></a>

當您建立資料表時，除了資料表名稱，您還必須指定資料表的主索引鍵。主索引鍵可唯一識別資料表中的每個項目，因此兩個項目不能具有相同的索引鍵。

DynamoDB 支援兩種不同類型的主索引鍵：
+ **分割區索引鍵**：簡易主索引鍵，由一個屬性 (稱為*分割區索引鍵*) 所組成。

  DynamoDB 使用分割區索引鍵值作為內部雜湊函數的輸入。雜湊函數的輸出決定要存放項目的分割區 (DynamoDB 的內部實體儲存體)。

   在只有一個分割區索引鍵的資料表中，沒有兩個項目的分割區索引鍵值是相同的。

  所以 [資料表、項目與屬性](#HowItWorks.CoreComponents.TablesItemsAttributes) 中描述的 *People* 資料表，是具有簡單主索引鍵 (*PersonID*) 的資料表範例。您可以藉由提供 *People* 資料表中任何項目的 *PersonId* 值，來直接存取該項目。
+ **分割區索引鍵與排序索引鍵**：稱為*複合主鍵*，這種類型的索引鍵是由兩個屬性組成。第一個屬性是*分割區索引鍵*，第二個屬性是*排序索引鍵*。

  DynamoDB 使用分割區索引鍵值作為內部雜湊函數的輸入。雜湊函數的輸出決定要存放項目的分割區 (DynamoDB 的內部實體儲存體)。具有相同分割區索引鍵值的所有項目會存放在一起，並依排序索引鍵值排序。

  在具有一個分割區金鑰與一個排序索引鍵的資料表中，兩個項目可能會有相同的分割區索引鍵值。不過，這兩個項目必須具有不同的排序索引鍵值。

  [資料表、項目與屬性](#HowItWorks.CoreComponents.TablesItemsAttributes) 中描述的 *Music* 資料表，是具有複合主鍵 (*Artist* 和 *SongTitle*) 的資料表範例。如果您提供 *Music* 資料表中任何項目的 *Artist* 與 *SongTitle* 值，即可直接存取該項目。

  複合主鍵可讓您更有彈性地查詢資料。例如，如果您只提供 *Artist* 值，則 DynamoDB 會擷取該演出者的所有歌曲。您可以提供一個 *Artist* 值與一段範圍的 *SongTitle* 值，來擷取特定演出者的歌曲子集。

**注意**  
項目的分割區索引鍵也稱為其*雜湊屬性*。*雜湊屬性*一詞衍生自 DynamoDB 中內部雜湊函數的用法，可將資料項目根據其分割區索引鍵值平均分佈到所有分割區。  
項目的排序索引鍵也稱為其*範圍屬性*。*範圍屬性*一詞衍生自 DynamoDB 存放項目的方式，具有相同分割區索引鍵的項目會實際緊密相鄰，並依排序索引鍵值排序。

每個主索引鍵屬性必須是純量 (亦即只能保留一個值)。主索引鍵屬性允許的資料類型僅限於字串、數字或二進位。其他非索引鍵屬性則沒有此限制。

## 次要索引
<a name="HowItWorks.CoreComponents.SecondaryIndexes"></a>

您可以在資料表上建立一或多個次要索引。*次要索引*可讓您在除了使用主索引鍵查詢外，也可使用備用索引鍵查詢資料表中的資料。DynamoDB 不需要您使用索引，但可讓您的應用程式在查詢資料時更具靈活性。在資料表上建立次要索引之後，您可以從索引讀取資料，方法與從資料表讀取十分相似。

DynamoDB 支援兩種索引：
+ 全域次要索引：一種含分割區索引鍵或排序索引鍵的索引，這些索引鍵可與資料表上的索引鍵不同。在全域次要索引中，主索引鍵值無需唯一。
+ 本機次要索引：是一種與資料表擁有相同分割區索引鍵但不同排序索引鍵的索引。

在 DynamoDB 中，全域次要索引 (GSI) 是涵蓋整個資料表的索引，可讓您查詢所有分割區索引鍵。本機次要索引 (LSI) 是一種與基礎資料表共用相同分割區索引鍵，但具有不同排序索引鍵的索引。

DynamoDB 中的每個資料表配額為 20 個全域次要索引 (預設配額) 與 5 個本機次要索引。

在上述範例 *Music* 資料表中，您可以依 *Artist* (分割區索引鍵) 或依 *Artist* 與 *SongTitle* (分割區索引鍵與排序索引鍵) 查詢資料項目。如果您也想要依 *Genre* 與 *AlbumTitle* 查詢資料，該怎麼辦？ 若要執行此作業，您可以在 *Genre* 與 *AlbumTitle* 上建立索引，然後查詢索引，方法與查詢 *Music* 資料表十分相似。

下圖顯示 *Music* 資料表範例，其中包含一個名為 *GenreAlbumTitle* 的新索引。在此索引中，*Genre* 是分割區索引鍵，而 *AlbumTitle* 是排序索引鍵。


| 音樂資料表 | *GenreAlbumTitle* | 
| --- | --- | 
|  <pre><br />{<br />    "Artist": "No One You Know",<br />    "SongTitle": "My Dog Spot",<br />    "AlbumTitle": "Hey Now",<br />    "Price": 1.98,<br />    "Genre": "Country",<br />    "CriticRating": 8.4<br />}                               <br />                                </pre>  |  <pre><br />{<br />    "Genre": "Country",<br />    "AlbumTitle": "Hey Now",<br />    "Artist": "No One You Know",<br />    "SongTitle": "My Dog Spot"<br />}<br />                                </pre>  | 
|  <pre><br />{<br />    "Artist": "No One You Know",<br />    "SongTitle": "Somewhere Down The Road",<br />    "AlbumTitle": "Somewhat Famous",<br />    "Genre": "Country",<br />    "CriticRating": 8.4,<br />    "Year": 1984<br />}<br />                                </pre>  |  <pre><br />{<br />    "Genre": "Country",<br />    "AlbumTitle": "Somewhat Famous",<br />    "Artist": "No One You Know",<br />    "SongTitle": "Somewhere Down The Road"<br />}<br />                                </pre>  | 
|  <pre><br />{<br />    "Artist": "The Acme Band",<br />    "SongTitle": "Still in Love",<br />    "AlbumTitle": "The Buck Starts Here",<br />    "Price": 2.47,<br />    "Genre": "Rock",<br />    "PromotionInfo": {<br />        "RadioStationsPlaying": {<br />            "KHCR",<br />            "KQBX",<br />            "WTNR",<br />            "WJJH"<br />        },<br />        "TourDates": {<br />            "Seattle": "20150622",<br />            "Cleveland": "20150630"<br />        },<br />        "Rotation": "Heavy"<br />    }<br />}<br />                                </pre>  |  <pre><br />{<br />    "Genre": "Rock",<br />    "AlbumTitle": "The Buck Starts Here",<br />    "Artist": "The Acme Band",<br />    "SongTitle": "Still In Love"<br />}<br />                                </pre>  | 
|  <pre><br />{<br />    "Artist": "The Acme Band",<br />    "SongTitle": "Look Out, World",<br />    "AlbumTitle": "The Buck Starts Here",<br />    "Price": 0.99,<br />    "Genre": "Rock"<br />}<br />                                </pre>  |  <pre><br />{<br />    "Genre": "Rock",<br />    "AlbumTitle": "The Buck Starts Here",<br />    "Artist": "The Acme Band",<br />    "SongTitle": "Look Out, World"<br />}<br />                                </pre>  | 

*GenreAlbumTitle* 索引的注意事項如下：
+ 每個索引都屬於一個資料表，稱為索引的*基礎資料表*。在上述範例中，*Music* 是 *GenreAlbumTitle* 索引的基礎資料表。
+ DynamoDB 會自動維護索引。當您新增、更新或刪除基礎資料表中的項目時，DynamoDB 會在屬於該資料表的任何索引中新增、更新或刪除對應的項目。
+ 建立索引時，您可以指定要從基礎資料表複製或*投影*到索引的屬性。DynamoDB 至少會將索引鍵屬性從基礎資料表投影到索引。`GenreAlbumTitle` 即為一例，其中只有索引鍵屬性會從 `Music` 資料表投影到索引。

您可以查詢 *GenreAlbumTitle* 索引，尋找特定內容類型的所有專輯 (例如所有 *Rock* 專輯)。您也可以查詢此索引，尋找特定內容類型中具有特定專輯標題的所有專輯 (例如標題開頭字母為 H 的所有 *Country* 專輯)。

如需詳細資訊，請參閱 [在 DynamoDB 中使用次要索引來改善資料存取](SecondaryIndexes.md)。

## DynamoDB Streams
<a name="HowItWorks.CoreComponents.Streams"></a>

DynamoDB Streams 是選用功能，可擷取 DynamoDB 資料表中的資料修改事件。這些事件的相關資料會依事件出現的順序，近乎即時地出現在串流中。

每個事件是以*串流紀錄*表示。如果您在資料表上啟用串流，只要發生下列其中一個事件，DynamoDB Streams 就會寫入一個串流紀錄：
+ 新增項目至資料表：串流會擷取整個項目的影像，包括其所有屬性。
+ 項目已更新：串流會擷取項目中已修改之任何屬性的「之前」與「之後」影像。
+ 從資料表刪除項目：串流會擷取整個項目的影像，再加以刪除。

每個串流紀錄也會包含資料表的名稱、事件時間戳記與其他中繼資料。串流紀錄的存留期為 24 小時，之後會自動從串流移除。

您可以將 DynamoDB Streams 與 搭配使用 AWS Lambda 來建立*觸發*，只要串流中出現感興趣的事件，就會自動執行程式碼。例如，以含有公司客戶資訊的 *Customers* 資料表為例。假設您想要傳送「歡迎」電子郵件給每個新客戶。您可以在該資料表上啟用串流，然後將串流與 Lambda 函式建立關聯。Lambda 函式會在每次出現新的串流紀錄時執行，但只會處理 *Customers* 資料表的新增項目。針對具有 `EmailAddress` 屬性的任何項目，Lambda 函式會調用 Amazon Simple Email Service (Amazon SES) 來將電子郵件傳送至該地址。

![\[將 DynamoDB Streams 與 Lambda 整合，以自動傳送歡迎電子郵件給新客戶。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/HowItWorksStreams.png)


**注意**  
在此範例中，最後一個客戶 Craig Roe 不會收到電子郵件，因為他沒有 `EmailAddress`。

除了觸發之外，DynamoDB Streams 還支援強大的解決方案，例如區域內和跨 AWS 區域的資料複寫、DynamoDB 資料表中資料的具體化視觀表、使用 Kinesis 具體化視觀表的資料分析等等。

如需詳細資訊，請參閱[DynamoDB Streams 的變更資料擷取](Streams.md)。

# DynamoDB API
<a name="HowItWorks.API"></a>

若要使用 Amazon DynamoDB，您的應用程式必須使用一些簡單的 API 操作。以下是這些操作的摘要，並依類別分組。

**注意**  
如需 API 操作的完整清單，請參閱 [Amazon DynamoDB API 參考](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/Welcome.html)。

**Topics**
+ [控制平面](#HowItWorks.API.ControlPlane)
+ [資料平面](#HowItWorks.API.DataPlane)
+ [DynamoDB Streams](#HowItWorks.API.Streams)
+ [交易](#HowItWorks.API.Transactions)

## 控制平面
<a name="HowItWorks.API.ControlPlane"></a>

*控制平面*操作可讓您建立及管理 DynamoDB 資料表。它們也可讓您使用索引、串流，以及相依於資料表的其他物件。
+  `CreateTable`：建立新的資料表。您可以選擇性地建立一或多個次要索引，並為資料表啟用 DynamoDB Streams。
+ `DescribeTable`：傳回資料表的相關資訊，例如其主索引鍵結構描述、輸送量設定、索引資訊。
+ `ListTables`：傳回您所有的資料表名稱清單。
+ `UpdateTable`：修改資料表或其索引的設定、在資料表上建立或移除新的索引，或修改資料表的 DynamoDB Streams 設定。
+ `DeleteTable`：從 DynamoDB 移除資料表及其所有相依物件。

## 資料平面
<a name="HowItWorks.API.DataPlane"></a>

*資料平面*操作可讓您對資料表中的資料執行建立、讀取、更新與刪除 (也稱為 *CRUD*) 動作。部分資料平面操作也可讓您從讀取資料。

您可以使用 [PartiQL：一種適用於 Amazon DynamoDB 的 SQL 相容查詢語言](ql-reference.md) 來執行這些 CRUD 操作，也可以使用 DynamoDB 的傳統 CRUD API 將每個操作分隔為不同的 API 呼叫。

### PartiQL - 一種 SQL 相容查詢語言
<a name="HowItWorks.API.DataPlane.partiql"></a>
+ `ExecuteStatement`：讀取資料表中的多個項目。您也可以寫入或更新資料表中的單一項目。在寫入或更新單一項目時，您必須指定主索引鍵屬性。
+ `BatchExecuteStatement`：從資料表寫入、更新或讀取多個項目。這比 `ExecuteStatement` 的效率高上好幾倍，因為您的應用程式只需要往返網路一次即可寫入或讀取項目。

### 傳統 API
<a name="HowItWorks.API.DataPlane.classic"></a>

#### 建立資料
<a name="HowItWorks.API.DataPlane.Create"></a>
+ `PutItem`：將單一項目寫入資料表。您必須指定主索引鍵屬性，但不必指定其他屬性。
+ `BatchWriteItem`：最多可將 25 個項目寫入資料表。這比呼叫 `PutItem` 的效率高上好幾倍，因為您的應用程式只需要往返網路一次即可寫入項目。

#### 讀取資料
<a name="HowItWorks.API.DataPlane.Read"></a>
+ `GetItem`：從資料表擷取單一項目。您必須指定所需項目的主索引鍵。您可以擷取整個項目，或只擷取其屬性子集。
+ `BatchGetItem`：最多可從一或多個資料表擷取 100 個項目。這比呼叫 `GetItem` 的效率高上好幾倍，因為您的應用程式只需要往返網路一次即可讀取項目。
+ `Query`：擷取所有具有特定分割區索引鍵的項目。您必須指定分割區索引鍵值。您可以擷取整個項目，或只擷取其屬性子集。您可以選擇性地將條件套用至排序索引鍵值，只擷取具有相同分割區索引鍵的資料子集。您可以在資料表上使用此操作，只要該資料表同時具有分割區索引鍵與排序索引鍵。您也可以在索引上使用此操作，只要該索引同時具有分割區索引鍵與排序索引鍵。
+ `Scan`：擷取指定資料表或索引中的所有項目。您可以擷取整個項目，或只擷取其屬性子集。您可以選擇性地套用篩選條件，只傳回您感興趣的值並捨棄其餘值。

#### 更新資料
<a name="HowItWorks.API.DataPlane.Update"></a>
+ `UpdateItem`：修改項目中的一或多個屬性。您必須指定要修改之項目的主索引鍵。您可以新增屬性，以及修改或移除現有的屬性。您也可以執行條件式更新，只在符合使用者定義的條件時，更新才會成功。您可以選擇性地實作原子計數器，遞增或遞減數字屬性，而不會影響其他寫入請求。

#### 刪除資料
<a name="HowItWorks.API.DataPlane.Delete"></a>
+ `DeleteItem`：從資料表刪除單一項目。您必須指定要刪除之項目的主索引鍵。
+ `BatchWriteItem`：最多可從一或多個資料表刪除 25 個項目。這比呼叫 `DeleteItem` 的效率高上好幾倍，因為您的應用程式只需要往返網路一次即可刪除項目。
**注意**  
您可以使用 `BatchWriteItem` 建立資料和刪除資料。

## DynamoDB Streams
<a name="HowItWorks.API.Streams"></a>

*DynamoDB Streams* 操作可讓您在資料表上啟用或停用串流，並允許存取串流中包含的資料修改紀錄。
+ `ListStreams`：傳回您所有的串流清單，或只傳回特定資料表的串流。
+ `DescribeStream`：傳回串流的相關資訊，例如其 Amazon Resource Name (ARN)，以及您的應用程式可開始讀取前幾個串流紀錄的位置。
+ `GetShardIterator`：傳回*碎片疊代運算*，這是您的應用程式從串流擷取紀錄所使用的資料結構。
+ `GetRecords`：使用指定的碎片疊代運算，擷取一或多個串流紀錄。

## 交易
<a name="HowItWorks.API.Transactions"></a>

*交易*提供了不可分割性、一致性、隔離性和耐久性 (ACID)，讓您能夠輕鬆地維持應用程式的資料正確度。

您可以使用 [PartiQL：一種適用於 Amazon DynamoDB 的 SQL 相容查詢語言](ql-reference.md) 來執行交易操作，也可以使用 DynamoDB 的傳統 CRUD API 將每個操作分隔為不同的 API 呼叫。

### PartiQL - 一種 SQL 相容查詢語言
<a name="HowItWorks.API.Transactions.DataPlane.partiql"></a>
+ `ExecuteTransaction`：允許對資料表內和跨資料表的多個項目進行保證全有或全無變更 CRUD 操作的批次操作。

### 傳統 API
<a name="HowItWorks.API.DataPlane.classic"></a>
+ `TransactWriteItems`：允許對資料表內和跨資料表的多個項目進行保證全有或全無變更的 `Put`、`Update` 和 `Delete` 操作的批次操作。
+ `TransactGetItems`：允許 `Get` 操作來從一或多個資料表擷取多個項目的批次操作。

# Amazon DynamoDB 中支援的資料類型和命名規則
<a name="HowItWorks.NamingRulesDataTypes"></a>

本節說明 Amazon DynamoDB 命名規則與 DynamoDB 支援的各種資料類型。這些資料類型有所限制。如需詳細資訊，請參閱 [資料類型](Constraints.md#limits-data-types)。

**Topics**
+ [命名規則](#HowItWorks.NamingRules)
+ [資料類型](#HowItWorks.DataTypes)
+ [資料類型描述項](#HowItWorks.DataTypeDescriptors)

## 命名規則
<a name="HowItWorks.NamingRules"></a>

DynamoDB 中的資料表、屬性與其他物件必須具有名稱。名稱應該具有意義且簡潔，例如 *Products*、*Books* 與 *Authors* 等都是一目了然的名稱。

以下是 DynamoDB 的命名規則：
+ 所有名稱都必須使用 UTF-8 編碼並區分大小寫。
+ 資料表名稱與索引名稱長度必須介於 3 到 255 個字元之間，而且只能包含下列字元：
  + `a-z`
  + `A-Z `
  + ` 0-9 `
  + `_` (底線)
  + `-` (破折號)
  + `.` (點號)
+ 屬性名稱至少必須為一個字元長，而且大小不能超過 64KB。屬性名稱盡可能簡潔是公認的最佳實務。這有助於減少使用的讀取請求單位，因為屬性名稱包含在儲存體和輸送量使用量的計量中。

  以下為例外狀況。這些屬性名稱絕對不能超過 255 個字元。
  + 次要索引分割區索引鍵名稱
  + 次要索引排序索引鍵名稱
  + 任何使用者指定的投影屬性名稱 (僅適用於本機次要索引) 

### 保留字與特殊字元
<a name="HowItWorks.NamingRules.Reserved"></a>

DynamoDB 有一份保留字與特殊字元清單。如需完整清單，請參閱 [DynamoDB 中的保留字](ReservedWords.md)。此外，下列字元在 DynamoDB 中具有特殊意義：**\$1** (井字號) 與 **:** (冒號)。

雖然 DynamoDB 可讓您將這些保留字與特殊字元用於名稱，但建議您避免這樣做，因為每次在表達式中使用這些名稱，都必須定義預留位置變數。如需詳細資訊，請參閱 [DynamoDB 中的表達式屬性名稱 (別名)](Expressions.ExpressionAttributeNames.md)。

## 資料類型
<a name="HowItWorks.DataTypes"></a>

針對資料表中的屬性，DynamoDB 支援許多不同的資料類型。其可分類如下：
+ **純量類型**：純量類型只能代表一個值。純量類型包括數字、字串、二進位、布林值與 Null。
+ **文件類型**：文件類型可代表具有巢狀屬性的複雜結構，如 JSON 文件中所示。文件類型為清單與映射。
+ **集合類型**：集合類型可代表多個純量值。集合類型包括字串集、數字集與二進位集。

當您建立資料表或次要索引時，您必須指定每個主索引鍵屬性 (分割區索引鍵與排序索引鍵) 的名稱與資料類型。此外，您必須將每個主索引鍵屬性定義為字串、數字或二進位類型。

DynamoDB 是 NoSQL 資料庫且*沒有結構描述*。這表示除了主索引鍵屬性之外，您不需要在建立資料表時定義任何屬性或資料類型。相較之下，關聯式資料庫需要您在建立資料表時定義每個資料行的名稱與資料類型。

以下是每個資料類型的說明，以及 JSON 格式的範例。

### 純量類型
<a name="HowItWorks.DataTypes.Scalar"></a>

純量類型包括數字、字串、二進位、布林值與 Null。

#### Number
<a name="HowItWorks.DataTypes.Number"></a>

數字可以是正數、負數或零。數字精確度最高可達 38 位數。超過此值會導致例外狀況。若您需要比 38 位數更高的精確度，則可以使用字串。
+ 正數範圍：1E-130 到 9.9999999999999999999999999999999999999E\$1125
+ 負數範圍：-9.9999999999999999999999999999999999999E\$1125 到 -1E-130

在 DynamoDB 中，數字會以變數長度表示。前後的零會截去。

所有數字都會以字串形式跨網路傳送到 DynamoDB，以提高語言與程式庫之間的相容性。不過，DynamoDB 會將其視為數學運算的數字類型屬性。

您可以使用數字資料類型來代表日期或時間戳記。一個做法是使用 epoch 時間，也就是自 1970 年 1 月 1 日 00:00:00 UTC 起經過的秒數。例如，epoch 時間 `1437136300` 代表 2015 年 7 月 17 日下午 12:31:40 UTC。

如需詳細資訊，請參閱 [http://en.wikipedia.org/wiki/Unix\$1time](http://en.wikipedia.org/wiki/Unix_time)。

#### String
<a name="HowItWorks.DataTypes.String"></a>

字串是 UTF-8 二進位編碼的 Unicode。如果屬性未用作為索引或資料表的索引鍵，則字串的最小長度可以是零，而且受到最大 DynamoDB 項目大小限制 400 KB 的限制。

下列其他限制適用於定義為類型字串的主索引鍵屬性：
+ 針對簡易主索引鍵，第一個屬性值 (分割區索引鍵) 的長度上限為 2048 位元組。
+ 針對複合主鍵，第二個屬性值 (排序索引鍵) 的長度上限為 1024 位元組。

DynamoDB 會收集並比較使用基本 UTF-8 字串編碼位元組的字串。例如，"`a`" (0x61) 大於 "`A`" (0x41)，而 "`¿`" (0xC2BF) 大於 "`z`" (0x7A)。

您可以使用字串資料類型來代表日期或時間戳記。一個做法是使用 ISO 8601 字串，如下列範例所示：
+ `2016-02-15`
+ `2015-12-21T17:42:34Z`
+ `20150311T122706Z`

如需詳細資訊，請參閱 [http://en.wikipedia.org/wiki/ISO\$18601](http://en.wikipedia.org/wiki/ISO_8601)。

**注意**  
與傳統的關聯式資料庫不同，DynamoDB 原生不支援日期和時間資料類型。使用 Unix Epoch 時間可能很有用，可用於將日期和時間資料儲存為數字資料類型。

#### 二進位
<a name="HowItWorks.DataTypes.Binary"></a>

二進位類型屬性可存放任何二進位資料，例如壓縮文字、加密資料或影像。每當 DynamoDB 比較二進位值時，都會將二進位資料的每個位元組視為不帶正負號。

如果屬性未用作為索引或資料表的索引鍵，則二進制屬性的長度可以是零，而且受到最大 DynamoDB 項目大小限制 400 KB 的限制。

如果您將主索引鍵屬性定義為二進位類型屬性，則會有以下其他限制：
+ 針對簡易主索引鍵，第一個屬性值 (分割區索引鍵) 的長度上限為 2048 位元組。
+ 針對複合主鍵，第二個屬性值 (排序索引鍵) 的長度上限為 1024 位元組。

您的應用程式必須將二進位值編碼為 base64 編碼格式，再傳送到 DynamoDB。收到這些值時，DynamoDB 會將資料解碼為不帶正負號的位元組陣列，並用作二進制屬性長度。

下列範例顯示使用 base64 編碼文字的二進制屬性。

```
dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk
```

#### Boolean
<a name="HowItWorks.DataTypes.Boolean"></a>

布林值類型屬性可存放 `true` 或 `false`。

#### Null
<a name="HowItWorks.DataTypes.Null"></a>

Null 代表具有未知或未定義狀態的屬性。

### 文件類型
<a name="HowItWorks.DataTypes.Document"></a>

文件類型為清單與映射。這些資料類型可彼此互相巢狀來代表複雜的資料結構，最高可達 32 層深。

清單或映射中的值數目不限，只要含有值的項目符合 DynamoDB 項目大小限制 (400 KB)。

 如果屬性不用於資料表或索引鍵，則屬性值可以是空字串或空的二進位值。屬性值不得為空的集合 (字串集合、數字集合或二進位集合)。然而，系統允許空的清單和映射。清單和映射中允許空字串和二進位值。如需詳細資訊，請參閱[屬性](Constraints.md#limits-attributes)。

#### 清單
<a name="HowItWorks.DataTypes.Document.List"></a>

清單類型屬性可存放一組排序的值。清單會以方括號括住：`[ ... ]`

清單類似於 JSON 陣列。清單元素中可存放的資料類型不限，而且清單元素中的元素不必屬於相同類型。

下列範例顯示一個清單，其中包含兩個字串與一個數字。

```
FavoriteThings: ["Cookies", "Coffee", 3.14159]
```

**注意**  
DynamoDB 可讓您使用清單中的個別元素，即使這些元素的巢狀結構很深也一樣。如需詳細資訊，請參閱[在 DynamoDB 中使用表達式](Expressions.md)。

#### Map
<a name="HowItWorks.DataTypes.Document.Map"></a>

映射類型屬性可存放一組未排序的名稱/值對。映射會以大括弧括住：`{ ... }`

映射類似於 JSON 物件。映射元素中可存放的資料類型不限，而且映射中的元素不必屬於相同類型。

映射很適合用來將 JSON 文件存放到 DynamoDB 中。下列範例顯示一個映射，其中包含字串、數字與含有另一個映射的巢狀清單。

```
{
    Day: "Monday",
    UnreadEmails: 42,
    ItemsOnMyDesk: [
        "Coffee Cup",
        "Telephone",
        {
            Pens: { Quantity : 3},
            Pencils: { Quantity : 2},
            Erasers: { Quantity : 1}
        }
    ]
}
```

**注意**  
DynamoDB 可讓您使用映射中的個別元素，即使這些元素的巢狀結構很深也一樣。如需詳細資訊，請參閱[在 DynamoDB 中使用表達式](Expressions.md)。

### 集合
<a name="HowItWorks.DataTypes.SetTypes"></a>

DynamoDB 支援代表數字集合、字串集合或二進位值集合的類型。集合內的所有元素必須屬於相同類型。例如，數字集合只能包含數字，字串集合只能包含字串。

集合中的值數目不限，只要含有值的項目符合 DynamoDB 項目大小限制 (400 KB)。

集合內的每個值必須是唯一的。集合內的值順序不會保留。因此，您的應用程式不得依賴集合內元素的任何特定順序。DynamoDB 不支援空集合，但集合中允許存在空字串和二進位值。

下列範例顯示字串集、數字集與二進位集：

```
["Black", "Green", "Red"]

[42.2, -19, 7.5, 3.14]

["U3Vubnk=", "UmFpbnk=", "U25vd3k="]
```

## 資料類型描述項
<a name="HowItWorks.DataTypeDescriptors"></a>

低階 DynamoDB API 通訊協定使用*資料類型描述項*做為字符，告知 DynamoDB 如何解譯每項屬性。

下列為 DynamoDB 資料類型描述項的完整清單：
+ **`S`**：字串
+ **`N`**：數字
+ **`B`**：二進位
+ **`BOOL`**：布林值
+ **`NULL`**：Null
+ **`M`**：映射
+ **`L`**：清單
+ **`SS`**：字串集合
+ **`NS`**：數字集合
+ **`BS`**：二進位集合

# DynamoDB 資料表類別
<a name="HowItWorks.TableClasses"></a>

DynamoDB 提供兩種資料表類別，旨在協助您最佳化成本。預設值為 DynamoDB 標準資料表類別，建議大多數工作負載使用。DynamoDB 標準：不常存取 (DynamoDB 標準-IA) 資料表類別針對以儲存為主要成本的資料表進行最佳化。例如，儲存不常存取資料的資料表 (例如應用程式日誌、舊社交媒體貼文、電子商務訂單歷史記錄以及過去遊戲成就) 都是適合標準-IA 資料表類別的選項。如需定價詳細資訊，請參閱 [Amazon DynamoDB 定價](https://aws.amazon.com/dynamodb/pricing/on-demand/)。

每個 DynamoDB 資料表都與一個資料表類別相關聯 (依 DynamoDB Standard 預設)。與資料表相關聯的所有次要索引都使用相同的資料表類別。每個資料表類別針對資料儲存以及讀取和寫入要求提供不同的定價。您可以根據資料表的儲存體和輸送量使用模式，為資料表選取最具成本效益的資料表類別。

資料表類別的選擇不是永久性的，您可以使用 、 AWS 管理主控台 AWS CLI 或 AWS SDK 變更此設定。DynamoDB 也支援使用 管理單一區域資料表和全域資料表 AWS CloudFormation 的資料表類別。若要進一步了解如何選取資料表類別，請參閱 [選擇 DynamoDB 資料表類別時的注意事項](WorkingWithTables.tableclasses.md)。

# DynamoDB 的分割區與資料分配
<a name="HowItWorks.Partitions"></a>

Amazon DynamoDB 將資料存放在分割區中。*分割區*是資料表的儲存配置，由固態硬碟 (SSDs) 提供支援，並自動複寫至 AWS 區域內的多個可用區域。分割區管理完全是由 DynamoDB 處理，您永遠不需要自行管理分割區。

當您建立資料表時，資料表的初始狀態為 `CREATING`。在此階段期間，DynamoDB 會配置足夠的分割區給資料表，讓它可以處理您的佈建輸送量需求。您可以在資料表狀態變更為 `ACTIVE` 之後，開始寫入及讀取資料表資料。

DynamoDB 會在下列情況下配置額外的分割區給資料表：
+ 如果您將資料表的佈建輸送量設定，增加到超過現有分割區所能支援的設定。
+ 如果現有的分割區容量將滿且需要更多儲存空間。

分割區管理會在背景自動進行，而且對您的應用程式是透明的。您的資料表會全程可供使用，並完整支援您的佈建輸送量需求。

如需詳細資訊，請參閱[分割區索引鍵設計](bp-partition-key-design.md)。

DynamoDB 中的全域次要索引也是由分割區所組成。全域次要索引中的資料會與其基礎資料表中的資料分開存放，但索引分割區的運作方式與資料表分割區相同。

## 資料分佈：分割區索引鍵
<a name="HowItWorks.Partitions.SimpleKey"></a>

如果您的資料表具有簡易主索引鍵 (僅限分割區索引鍵)，DynamoDB 會根據每個項目的分割區索引鍵值來存放與擷取項目。

為了將項目寫入資料表，DynamoDB 使用分割區索引鍵值作為內部雜湊函數的輸入。雜湊函數的輸出值決定要存放項目的分割區。

若要讀取資料表的項目，您必須指定項目的分割區索引鍵值。DynamoDB 會使用此值作為雜湊函數的輸入，產生能夠找到此項目的分割區。

下圖顯示一個名為 *Pets* 的資料表，其橫跨多個分割區。該資料表的主索引鍵是 *AnimalType* (僅顯示此索引鍵屬性)。DynamoDB 使用其雜湊函數來判斷新項目的存放位置，在此例中是依據字串 *Dog* 的雜湊值。請注意，項目不會依序存放。每個項目的位置取決於其分割區索引鍵的雜湊值。

![\[DynamoDB 依據分割區索引鍵的雜湊值，將資料表項目分配至不同分割區。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/HowItWorksPartitionKey.png)


**注意**  
DynamoDB 已經過最佳化，可將項目一致分佈到資料表的分割區，不論有多少分割區。建議您選擇相較於資料表中的項目數，可擁有大量相異值的分割區索引鍵。

## 資料分佈：分割區索引鍵與排序索引鍵
<a name="HowItWorks.Partitions.CompositeKey"></a>

如果資料表具有複合主鍵 (分割區索引鍵和排序索引鍵)，則 DynamoDB 會以與 [資料分佈：分割區索引鍵](#HowItWorks.Partitions.SimpleKey) 中所述相同的方式計算分割區索引鍵的雜湊值。系統傾向將具有相同分割區索引鍵值的項目存放在相鄰位置，並依排序索引鍵屬性的值排序。具有相同分割區索引鍵屬性值的一組項目稱為「項目集合」。項目集合經過最佳化，可高效擷取集合中指定範圍的項目。若資料表未設定本機次要索引，DynamoDB 會自動將項目集合分配至所需數量的分割區，以存放資料並維持讀寫輸送量。

為了將項目寫入資料表，DynamoDB 會計算分割區索引鍵的雜湊值，來決定哪個分割區應該包含項目。在該分割區中，多個項目可以具有相同的分割區索引鍵值。因此，DynamoDB 使用相同的分割區索引鍵將項目儲存在其他項目中，按排序索引鍵遞增排列。

若要讀取資料表的項目，您必須指定項目的分割區索引鍵值和排序索引鍵值。DynamoDB 會計算分割區索引鍵的雜湊值，產生能夠找到此項目的分割區。

如果您想要的項目具有相同的分割區索引鍵值，您可以在單一操作 (`Query`) 中從資料表讀取多個項目。DynamoDB 會傳回具有該分割區索引鍵值的所有項目。您可以選擇性地將條件套用至排序索引鍵，讓它只傳回特定值範圍內的項目。

假設 *Pets* 資料表具有複合主鍵，其中包含 *AnimalType* (分割區索引鍵) 與 *Name* (排序索引鍵)。下圖顯示 DynamoDB 寫入一個項目，其分割區索引鍵值為 *Dog*，排序索引鍵值為 *Fido*。

![\[DynamoDB 會儲存具有複合分割區索引鍵的項目，並根據排序索引鍵屬性的值進行排序。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/HowItWorksPartitionKeySortKey.png)


若要從 *Pets*​ 資料表讀取同樣的項目，DynamoDB 會計算 *Dog* 的雜湊值，產生存放這些項目的分割區。然後，DynamoDB 會掃描排序索引鍵屬性值，直到找到 *Fido*。

若要讀取 *AnimalType* 為 *Dog* 的所有項目，您可以發出 `Query` 操作，而不需要指定排序索引鍵條件。根據預設，項目會依存放順序 (即依排序索引鍵的遞增順序) 傳回。您也可以改為請求遞減順序。

若只要查詢其中的一些 *Dog* 項目，您可以將條件套用至排序索引鍵 (例如僅限 *Dog* 項目，其中 *Name* 開始的字母介於 `A` 到 `K` 的範圍內)。

**注意**  
在 DynamoDB 資料表中，每個分割區索引鍵值的相異排序索引鍵值數目沒有上限。如果您需要在 *Pets* 資料表中存放數十億個 *Dog* 項目，則 DynamoDB 會分配足夠的儲存空間來自動處理此需求。

# 了解如何從 SQL 過渡到 NoSQL
<a name="SQLtoNoSQL"></a>

若您是應用程式開發人員，您可能已有使用關聯式資料庫管理系統 (RDBMS) 和結構式查詢語言 (SQL) 的經驗。開始使用 Amazon DynamoDB 後，您可能會發現許多相似點，但也有許多相異點。*NoSQL* 一詞用來說明具高可用性、可擴展性且高效能最佳化的非關聯式資料庫系統。NoSQL 資料庫 (例如 DynamoDB) 與關聯式模型不同，它會使用另一種模型來管理資料，例如鍵/值對或文件儲存。如需詳細資訊，請參閱[何謂 NoSQL？](https://aws.amazon.com/nosql)。

Amazon DynamoDB 支援 [PartiQL](https://partiql.org/)，其為一種與 SQL 相容的開放原始碼查詢語言，讓您能以高效率的方式查詢資料，不論資料存放在何處或以何種格式存放。使用 PartiQL，您可以輕鬆處理來自關聯式資料庫的結構化資料、開放資料格式的半結構化和巢套資料，甚至是 NoSQL 或文件資料庫中允許不同行不同屬性的無固定結構資料。如需詳細資訊，請參閱 [PartiQL 查詢語言](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html)。

以下章節說明常見的資料庫任務，並比較和比對 SQL 陳述式及其相對應的 DynamoDB 操作。

**注意**  
本節中的 SQL 範例與 MySQL RDBMS 相容。  
本節中的 DynamoDB 範例會顯示 DynamoDB 操作的名稱，並以 JSON 格式呈現該操作的參數。

**Topics**
+ [在關聯式 (SQL) 資料庫與 NoSQL 之間進行取捨](SQLtoNoSQL.WhyDynamoDB.md)
+ [從資料表刪除資料時，關聯式 (SQL) 資料庫與 DynamoDB 的差異](SQLtoNoSQL.Accessing.md)
+ [建立資料表時，關聯式 (SQL) 資料庫與 DynamoDB 之間的差異](SQLtoNoSQL.CreateTable.md)
+ [從關聯式 (SQL) 資料庫與 DynamoDB 取得資料表資訊的差異](SQLtoNoSQL.GetTableInfo.md)
+ [寫入資料表時，關聯式 (SQL) 資料庫與 DynamoDB 的差異](SQLtoNoSQL.WriteData.md)
+ [讀取資料表資料時，關聯式 (SQL) 資料庫與 DynamoDB 的主要差異](SQLtoNoSQL.ReadData.md)
+ [管理索引時，關聯式 (SQL) 資料庫與 DynamoDB 的差異](SQLtoNoSQL.Indexes.md)
+ [修改資料表資料時，關聯式 (SQL) 資料庫與 DynamoDB 的差異](SQLtoNoSQL.UpdateData.md)
+ [從資料表刪除資料時，關聯式 (SQL) 資料庫與 DynamoDB 的差異](SQLtoNoSQL.DeleteData.md)
+ [移除資料表時，關聯式 (SQL) 資料庫與 DynamoDB 的差異](SQLtoNoSQL.RemoveTable.md)

# 在關聯式 (SQL) 資料庫與 NoSQL 之間進行取捨
<a name="SQLtoNoSQL.WhyDynamoDB"></a>

當今應用程式的要求比以往更加嚴苛。例如，一款線上遊戲剛開始可能只有少數使用者和極少量的資料。但是，如果遊戲成功了，該遊戲可能容易超過基礎資料庫管理系統的資源。Web 應用程式常擁有數百、數千，甚至數百萬名並行使用者，並且每天產生數 TB 或以上的新資料。這種應用程式的資料庫每秒必須處理成千上萬筆讀取和寫入。

Amazon DynamoDB 正適合這類工作負載。身為開發人員，您可以從小規模開始，並隨著您的應用程式變得愈來愈熱門而逐漸增加使用率。DynamoDB 可無縫擴展，能夠處理極大量的資料和使用者。

如需傳統關聯式資料庫建模以及如何針對 DynamoDB 進行調整的詳細資訊，請參閱 [在 DynamoDB 中製作關聯式資料模型的最佳實務](bp-relational-modeling.md)。

下表顯示關聯式資料庫管理系統 (RDBMS) 與 DynamoDB 之間的一些概要性差異。


****  

| 特性 | 關聯式資料庫管理系統 (RDBMS) | Amazon DynamoDB | 
| --- | --- | --- | 
| 最佳工作負載 | 臨機操作查詢、資料倉儲、OLAP (線上分析處理)。 | Web 規模應用程式，包括社群網路、遊戲、媒體共用及物聯網 (IoT)。 | 
| 資料模型 | 關聯式模型需要定義良好的結構描述，所有資料皆會標準化成資料表、資料列及資料行。此外，資料表、資料行、索引和其他資料庫元素間也都會定義所有關聯性。 | DynamoDB 不具結構描述。每個資料表都必須具備一個主索引鍵，以唯一識別各個資料項目，但其他非索引鍵屬性則沒有類似的限制條件。DynamoDB 可以管理結構化或半結構化資料，包括 JSON 文件。 | 
| 資料存取 | SQL 是存放和擷取資料的標準。關聯式資料庫提供豐富的工具組，可簡化資料庫驅動之應用程式的開發，但這些工具全都使用 SQL。 | 您可以使用 AWS 管理主控台、 AWS CLI或 NoSQL WorkBench 來使用 DynamoDB，並執行臨機操作。SQL 相容查詢語言 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) 讓您能在 DynamoDB 中選取、插入、更新和刪除資料。應用程式可以使用 AWS 軟體開發套件 (SDKs)，使用以物件為基礎、以文件為中心或低階介面來使用 DynamoDB。 | 
| 效能 | 關聯式資料庫經儲存最佳化，因此效能一般取決於磁碟子系統。開發人員和資料庫管理員必須最佳化查詢、索引及資料表結構，才能達到尖峰效能。 | DynamoDB 經運算最佳化，因此效能主要是基礎硬體和網路延遲的功能。作為受管服務，DynamoDB 會將您和您的應用程式與這些實作細節隔開，讓您可專心設計及建置穩固且高效能的應用程式。 | 
| 擴展 | 使用更快的硬體可以更容易地向上擴展。資料庫資料表也能在分散式系統中橫跨多部主機，但這需要額外投資。關聯式資料庫在檔案的數目和大小方面皆具有大小上限，而對最大擴展能力有所限制。 | DynamoDB 專為使用分散式硬體叢集橫向擴充而設計。這項設計可讓輸送量增加，卻不會增加延遲。客戶可指定其輸送量需求，DynamoDB 便會配置充足的資源以符合這些需求。每個資料表的項目數目沒有上限，該資料表的總大小也沒有上限。 | 

# 從資料表刪除資料時，關聯式 (SQL) 資料庫與 DynamoDB 的差異
<a name="SQLtoNoSQL.Accessing"></a>

在應用程式可以存取資料庫之前，必須先進行*驗證*，以確保允許應用程式使用資料庫。必須對其進行*授權*，以便應用程式執行其具有許可的動作。

下列圖表說明用戶端與關聯式資料庫及 Amazon DynamoDB 的互動。

![\[與關聯式及 NoSQL 資料庫的互動。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/SQLtoNoSQL.png)


下表提供用戶端互動任務的詳細資訊。


****  

| 特性 | 關聯式資料庫管理系統 (RDBMS) | Amazon DynamoDB | 
| --- | --- | --- | 
| 存取資料庫的工具 |  多數關聯式資料庫皆提供命令列介面 (CLI)，讓您可輸入臨機操作 SQL 陳述式並立即查看結果。  | 在大多數的案例中，您會撰寫應用程式程式碼。您也可以使用 AWS 管理主控台、 AWS Command Line Interface (AWS CLI) 或 NoSQL Workbench 將臨機操作請求傳送至 DynamoDB 並檢視結果。SQL 相容查詢語言 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) 讓您能在 DynamoDB 中選取、插入、更新和刪除資料。 | 
| 連線到資料庫 | 應用程式會建立並維持與資料庫的網路連線。當應用程式完成時，它會終止連線。 | DynamoDB 是一項 Web 服務，與該服務之間的互動是無狀態的。應用程式不需要維持耐久性網路連線。而是使用 HTTP(S) 請求及回應與 DynamoDB 互動。 | 
| 身分驗證 | 應用程式在經過驗證前無法連線到資料庫。RDBMS 可自行執行身分驗證，也可將此任務交由主機作業系統或目錄服務執行。 | 每一個發送至 DynamoDB 的請求都必須附有密碼編譯簽章，此簽章會驗證該特定請求。 AWS SDKs 提供建立簽章和簽署請求所需的所有邏輯。如需詳細資訊，請參閱《》中的[簽署 AWS API 請求](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)AWS 一般參考。 | 
| 授權 | 應用程式只能執行獲得授權的動作。資料庫管理員或應用程式擁有者可使用 SQL GRANT 及 REVOKE 陳述式控制對資料庫物件 (例如資料表)、資料 (例如資料表中的資料列) 的存取，或控制發行特定 SQL 陳述式的能力。 | 在 DynamoDB 中，授權由 AWS Identity and Access Management (IAM) 處理。您可以撰寫 IAM 政策來授予 DynamoDB 資源 (例如資料表) 相關許可，然後允許使用者和角色使用該政策。IAM 也針對 DynamoDB 資料表中的個別資料項目提供精細的存取控制。如需詳細資訊，請參閱[Amazon DynamoDB 的 Identity and Access Management](security-iam.md)。 | 
| 傳送請求 | 應用程式會針對想要執行的每項資料庫操作各發出一個 SQL 陳述式。在收到 SQL 陳述式後，RDBMS 會檢查其語法，建立執行操作的計畫，然後執行計畫。 | 應用程式會向 DynamoDB 傳送 HTTP(S) 請求。該請求包含要執行之 DynamoDB 操作的名稱及參數。DynamoDB 會立即執行請求。 | 
| 接收回應 | RDBMS 會傳回 SQL 陳述式的結果。若發生錯誤，RDBMS 會傳回錯誤狀態及訊息。 | DynamoDB 會傳回含有操作結果的 HTTP(S) 回應。若發生錯誤，DynamoDB 會傳回 HTTP 錯誤狀態及訊息。 | 

# 建立資料表時，關聯式 (SQL) 資料庫與 DynamoDB 之間的差異
<a name="SQLtoNoSQL.CreateTable"></a>

資料表是關聯式資料庫及 Amazon DynamoDB 中的基本資料結構。關聯式資料庫管理系統 (RDBMS) 需要您在建立資料表的同時定義其結構描述。反之，DynamoDB 資料表不具結構描述；除了主索引鍵之外，您不需要在建立資料表時定義任何額外屬性或資料類型。

下一節將比較使用 SQL 建立資料表的方式，以及使用 DynamoDB 建立資料表的方式。

**Topics**
+ [使用 SQL 建立資料表](#SQLtoNoSQL.CreateTable.SQL)
+ [使用 DynamoDB 建立資料表](#SQLtoNoSQL.CreateTable.DynamoDB)

## 使用 SQL 建立資料表
<a name="SQLtoNoSQL.CreateTable.SQL"></a>

在 SQL 中，您會使用 `CREATE TABLE` 陳述式建立資料表，如下列範例所示。

```
CREATE TABLE Music (
    Artist VARCHAR(20) NOT NULL,
    SongTitle VARCHAR(30) NOT NULL,
    AlbumTitle VARCHAR(25),
    Year INT,
    Price FLOAT,
    Genre VARCHAR(10),
    Tags TEXT,
    PRIMARY KEY(Artist, SongTitle)
);
```

此資料表的主索引鍵包含 *Artist* 和 *SongTitle*。

您必須定義資料表所有資料行、資料類型及主索引鍵。(若有需要，您之後可以使用 `ALTER TABLE` 陳述式變更這些定義)。

許多 SQL 實作可讓您為資料表定義儲存規格，做為 `CREATE TABLE` 陳述式的一部分。除非您另外指示，否則會以預設儲存設定建立資料表。在生產環境中，資料庫管理員可協助判斷最佳儲存參數。

## 使用 DynamoDB 建立資料表
<a name="SQLtoNoSQL.CreateTable.DynamoDB"></a>

使用 `CreateTable` 操作建立佈建模式資料表，並依下方所示指定參數：

```
{
    TableName : "Music",
    KeySchema: [
        {
            AttributeName: "Artist",
            KeyType: "HASH" //Partition key
        },
        {
            AttributeName: "SongTitle",
            KeyType: "RANGE" //Sort key
        }
    ],
    AttributeDefinitions: [
        {
            AttributeName: "Artist",
            AttributeType: "S"
        },
        {
            AttributeName: "SongTitle",
            AttributeType: "S"
        }
    ],
    ProvisionedThroughput: {       // Only specified if using provisioned mode
        ReadCapacityUnits: 1,
        WriteCapacityUnits: 1
    }
}
```

此資料表的主索引鍵包含 *Artist* (分割區索引鍵) 和 *SongTitle* (排序索引鍵)。

您必須提供下列參數給 `CreateTable`：
+ `TableName`：資料表的名稱。
+ `KeySchema`：用於主索引鍵的屬性。如需詳細資訊，請參閱 [資料表、項目與屬性](HowItWorks.CoreComponents.md#HowItWorks.CoreComponents.TablesItemsAttributes) 及 [主索引鍵](HowItWorks.CoreComponents.md#HowItWorks.CoreComponents.PrimaryKey)。
+ `AttributeDefinitions`：索引鍵結構描述屬性的資料類型。
+ `ProvisionedThroughput (for provisioned tables)`：此資料表所需的每秒讀取及寫入數。DynamoDB 會保留足夠的儲存和系統資源，以便始終能满足您的輸送量需求。若有需要，您之後可以使用 `UpdateTable` 操作進行變更。因為儲存配置全由 DynamoDB 管理，因此您不需要指定資料表的儲存需求。

# 從關聯式 (SQL) 資料庫與 DynamoDB 取得資料表資訊的差異
<a name="SQLtoNoSQL.GetTableInfo"></a>

您可以確認資料表是否已按照您的規格建立。關聯式資料庫中會顯示資料表的所有結構描述。Amazon DynamoDB 資料表不具結構描述，因此只會顯示主索引鍵屬性。

**Topics**
+ [取得 SQL 資料表的相關資訊](#SQLtoNoSQL.GetTableInfo.SQL)
+ [取得 DynamoDB 中資料表的相關資訊](#SQLtoNoSQL.GetTableInfo.DynamoDB)

## 取得 SQL 資料表的相關資訊
<a name="SQLtoNoSQL.GetTableInfo.SQL"></a>

多數關聯式資料庫管理系統 (RDBMS) 可讓您說明資料表的結構，即欄、資料類型、主索引鍵定義等。SQL 沒有此操作的標準做法。但是，許多資料庫系統皆會提供 `DESCRIBE` 命令。以下是 MySQL 的範例。

```
DESCRIBE Music;
```

這會傳回您資料表的結構，內含所有資料行名稱、資料類型及大小。

```
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| Artist     | varchar(20) | NO   | PRI | NULL    |       |
| SongTitle  | varchar(30) | NO   | PRI | NULL    |       |
| AlbumTitle | varchar(25) | YES  |     | NULL    |       |
| Year       | int(11)     | YES  |     | NULL    |       |
| Price      | float       | YES  |     | NULL    |       |
| Genre      | varchar(10) | YES  |     | NULL    |       |
| Tags       | text        | YES  |     | NULL    |       |
+------------+-------------+------+-----+---------+-------+
```

此資料表的主索引鍵包含 *Artist* 和 *SongTitle*。

## 取得 DynamoDB 中資料表的相關資訊
<a name="SQLtoNoSQL.GetTableInfo.DynamoDB"></a>

DynamoDB 具有類似的 `DescribeTable` 操作。唯一的參數是資料表名稱。

```
{
    TableName : "Music"
}
```

`DescribeTable` 的回覆如下所示。

```
{
  "Table": {
    "AttributeDefinitions": [
      {
        "AttributeName": "Artist",
        "AttributeType": "S"
      },
      {
        "AttributeName": "SongTitle",
        "AttributeType": "S"
      }
    ],
    "TableName": "Music",
    "KeySchema": [
      {
        "AttributeName": "Artist",
        "KeyType": "HASH"  //Partition key
      },
      {
        "AttributeName": "SongTitle",
        "KeyType": "RANGE"  //Sort key
      }
    ],

    ...
```

`DescribeTable` 也會傳回有關資料表索引、佈建輸送量設定、約略的項目計數及其他中繼資料的資訊。

# 寫入資料表時，關聯式 (SQL) 資料庫與 DynamoDB 的差異
<a name="SQLtoNoSQL.WriteData"></a>

關聯式資料庫資料表含有資料的資料*列*。資料列由*欄*所組成。Amazon DynamoDB 資料表包含*項目*。項目由*屬性*組成。

本節說明如何將一個資料列 (或項目) 寫入資料表。

**Topics**
+ [將資料寫入 SQL 資料表](#SQLtoNoSQL.WriteData.SQL)
+ [將資料寫入 DynamoDB 中的資料表](#SQLtoNoSQL.WriteData.DynamoDB)

## 將資料寫入 SQL 資料表
<a name="SQLtoNoSQL.WriteData.SQL"></a>

關聯式資料庫中的資料表為二維資料結構，由資料列和資料行組成。某些資料庫管理系統也支援半結構化資料，通常使用原生 JSON 或 XML 資料類型。但是，實作細節會因廠商而有所不同。

在 SQL 中，您會使用 `INSERT` 陳述式新增列至資料表。

```
INSERT INTO Music
    (Artist, SongTitle, AlbumTitle,
    Year, Price, Genre,
    Tags)
VALUES(
    'No One You Know', 'Call Me Today', 'Somewhat Famous',
    2015, 2.14, 'Country',
    '{"Composers": ["Smith", "Jones", "Davis"],"LengthInSeconds": 214}'
);
```

此資料表的主索引鍵包含 *Artist* 和 *SongTitle*。您必須指定這些資料行的值。

**注意**  
此範例使用 *Tags* 資料行存放 *Music* 資料表中歌曲的半結構化資料。*Tags* 資料行已定義為 TEXT 類型，可在 MySQL 中存放多達 65,535 個字元。

## 將資料寫入 DynamoDB 中的資料表
<a name="SQLtoNoSQL.WriteData.DynamoDB"></a>

在 Amazon DynamoDB 中，您可以使用 DynamoDB API 或 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (SQL 相容查詢語言) 將項目新增至資料表。

------
#### [ DynamoDB API ]

借助 DynamoDB API，您可以使用 `PutItem` 操作將項目新增至資料表。

```
{
    TableName: "Music",
    Item: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today",
        "AlbumTitle":"Somewhat Famous",
        "Year": 2015,
        "Price": 2.14,
        "Genre": "Country",
        "Tags": {
            "Composers": [
                  "Smith",
                  "Jones",
                  "Davis"
            ],
            "LengthInSeconds": 214
        }
    }
}
```

此資料表的主索引鍵包含 *Artist* 和 *SongTitle*。您必須指定這些屬性的值。

以下為此 `PutItem` 範例的一些重要須知：
+ DynamoDB 會使用 JSON 提供文件的原生支援。這讓 DynamoDB 適合存放半結構化資料，例如 *Tags*。您也可以從 JSON 文件擷取及運用資料。
+ *Music* (音樂) 資料表除了主索引鍵 (*Artist* 和 *SongTitle*) 之外，沒有任何預先定義的屬性。
+ 多數 SQL 資料庫都以交易為導向。當您發出 `INSERT` 陳述式時，資料都不會永久修改，直到您發出 `COMMIT` 陳述式為止。若使用 Amazon DynamoDB，當 DynamoDB 以 HTTP 200 狀態代碼 (`OK`) 回覆時，`PutItem` 操作會永久生效。

下列是一些其他的 `PutItem` 範例。

```
{
    TableName: "Music",
    Item: {
        "Artist": "No One You Know",
        "SongTitle": "My Dog Spot",
        "AlbumTitle":"Hey Now",
        "Price": 1.98,
        "Genre": "Country",
        "CriticRating": 8.4
    }
}
```

```
{
    TableName: "Music",
    Item: {
        "Artist": "No One You Know",
        "SongTitle": "Somewhere Down The Road",
        "AlbumTitle":"Somewhat Famous",
        "Genre": "Country",
        "CriticRating": 8.4,
        "Year": 1984
    }
}
```

```
{
    TableName: "Music",
    Item: {
        "Artist": "The Acme Band",
        "SongTitle": "Still In Love",
        "AlbumTitle":"The Buck Starts Here",
        "Price": 2.47,
        "Genre": "Rock",
        "PromotionInfo": {
            "RadioStationsPlaying":[
                 "KHCR", "KBQX", "WTNR", "WJJH"
            ],
            "TourDates": {
                "Seattle": "20150625",
                "Cleveland": "20150630"
            },
            "Rotation": "Heavy"
        }
    }
}
```

```
{
    TableName: "Music",
    Item: {
        "Artist": "The Acme Band",
        "SongTitle": "Look Out, World",
        "AlbumTitle":"The Buck Starts Here",
        "Price": 0.99,
        "Genre": "Rock"
    }
}
```

**注意**  
除了 `PutItem` 之外，DynamoDB 還支援 `BatchWriteItem` 操作，可讓您同時寫入多個項目。

------
#### [ PartiQL for DynamoDB ]

借助 PartiQL，您可以使用 PartiQL `Insert` 陳述式，使用 `ExecuteStatement` 操作將項目新增至資料表，

```
INSERT into Music value {  
    'Artist': 'No One You Know',
    'SongTitle': 'Call Me Today',
    'AlbumTitle': 'Somewhat Famous',
    'Year' : '2015',
    'Genre' : 'Acme'
}
```

此資料表的主索引鍵包含 *Artist* 和 *SongTitle*。您必須指定這些屬性的值。

**注意**  
如需使用 `Insert` 和 `ExecuteStatement` 的程式碼範例，請參閱 [適用於 DynamoDB 的 PartiQL Insert 陳述式](ql-reference.insert.md)。

------

# 讀取資料表資料時，關聯式 (SQL) 資料庫與 DynamoDB 的主要差異
<a name="SQLtoNoSQL.ReadData"></a>

使用 SQL，您可用 `SELECT` 陳述式從資料表擷取一或多個資料列。並可用 `WHERE` 子句決定傳回給您的資料。

這與使用 Amazon DynamoDB 不同，其提供下列操作來讀取資料：
+ `ExecuteStatement` 會從資料表檢索單一或多個項目。`BatchExecuteStatement` 以單一操作從不同資料表檢索多個項目。這些操作都使用 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html)，這是一種與 SQL 相容的查詢語言。
+ `GetItem`：從資料表擷取單一項目。因為可供直接存取項目的實體位置，所以此為讀取單一項目最有效率的方式。(DynamoDB 還會提供 `BatchGetItem` 操作，允許您在單一操作中執行多達 100 個 `GetItem` 呼叫。)
+ `Query`：擷取具有特定分割區索引鍵的所有項目。在那些項目中，您可以將條件套用至排序索引鍵，並只擷取部分資料。`Query` 供您快速且有效率地存取存放資料的分割區。(如需詳細資訊，請參閱 [DynamoDB 的分割區與資料分配](HowItWorks.Partitions.md)。)
+ `Scan`：擷取指定資料表中的所有項目。(此操作不應用於大型資料表，因為會使用大量系統資源)。

**注意**  
使用關聯式資料庫，您可用 `SELECT` 陳述式聯結多個資料表的資料，然後傳回結果。聯結是關聯式模型的基礎。若要確保聯結可有效率地執行，資料庫及其應用程式應持續調整其效能。DynamoDB 是不支援資料表聯結的非關聯式 NoSQL 資料庫。相反地，應用程式會一次從一個資料表讀取資料。

下列章節說明讀取資料的不同使用案例，以及如何使用關聯式資料庫和 DynamoDB 執行這些任務。

**Topics**
+ [使用主索引鍵讀取項目的差異](SQLtoNoSQL.ReadData.SingleItem.md)
+ [查詢資料表的差異](SQLtoNoSQL.ReadData.Query.md)
+ [掃描資料表的差異](SQLtoNoSQL.ReadData.Scan.md)

# 使用主索引鍵讀取項目的差異
<a name="SQLtoNoSQL.ReadData.SingleItem"></a>

資料庫常見的一種存取模式是從資料表讀取單一項目。您必須指定您想要讀取之項目的主索引鍵。

**Topics**
+ [在 SQL 中使用項目的主索引鍵讀取項目](#SQLtoNoSQL.ReadData.SingleItem.SQL)
+ [在 DynamoDB 中使用項目的主索引鍵讀取項目](#SQLtoNoSQL.ReadData.SingleItem.DynamoDB)

## 在 SQL 中使用項目的主索引鍵讀取項目
<a name="SQLtoNoSQL.ReadData.SingleItem.SQL"></a>

在 SQL 中，您會使用 `SELECT` 陳述式從資料表擷取資料。您可以在結果中請求一或多個資料行 (或使用 `*` 運算子請求所有資料行)。`WHERE` 子句則可決定要傳回的資料列。

下列為從 *Music* 資料表擷取單一資料列的 `SELECT` 陳述式。`WHERE` 子句會指定主索引鍵值。

```
SELECT *
FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today'
```

您可以修改此查詢，只擷取部分資料行。

```
SELECT AlbumTitle, Year, Price
FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today'
```

請注意，此資料表的主索引鍵包含 *Artist* 和 *SongTitle*。

## 在 DynamoDB 中使用項目的主索引鍵讀取項目
<a name="SQLtoNoSQL.ReadData.SingleItem.DynamoDB"></a>

在 Amazon DynamoDB 中，您可以使用 DynamoDB API 或 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (SQL 相容查詢語言) 讀取資料表中的項目。

------
#### [ DynamoDB API ]

借助 DynamoDB API，您可以使用 `PutItem` 操作將項目新增至資料表。

DynamoDB 提供 `GetItem` 操作，可依主索引鍵擷取項目。`GetItem` 的效率極高，因為它可供您直接存取項目的實體位置。(如需詳細資訊，請參閱 [DynamoDB 的分割區與資料分配](HowItWorks.Partitions.md)。)

根據預設，`GetItem` 會傳回整個項目及其所有屬性。

```
{
    TableName: "Music",
    Key: {
        "Artist": "No One You Know",
        "SongTitle": "Call Me Today"
    }
}
```

您可以新增 `ProjectionExpression` 參數，以只傳回某些屬性。

```
{
    TableName: "Music",
    Key: {
        "Artist": "No One You Know",
        "SongTitle": "Call Me Today"
    },
    "ProjectionExpression": "AlbumTitle, Year, Price"
}
```

請注意，此資料表的主索引鍵包含 *Artist* 和 *SongTitle*。

DynamoDB `GetItem` 操作非常有效率。它使用主索引鍵值判斷所指項目的確切儲存位置，然後直接從該位置擷取項目。在使用主索引鍵值擷取項目的案例中，SQL `SELECT` 陳述式一樣具有效率。

SQL `SELECT` 陳述式可支援多種查詢和資料表掃描。DynamoDB 使用其 `Query` 和 `Scan` 操作提供類似功能，這些操作會在 [查詢資料表的差異](SQLtoNoSQL.ReadData.Query.md) 和 [掃描資料表的差異](SQLtoNoSQL.ReadData.Scan.md) 中說明。

SQL `SELECT` 陳述式可執行資料表聯結，可讓您同時從多個資料表擷取資料。在資料庫資料表標準化且資料表間的關聯性明確時，聯結最為有效。但是，若您在單一 `SELECT` 陳述式中聯結太多資料表，應用程式的效能可能會受到影響。您可以使用資料庫複寫、具體化視觀表，或查詢重寫來因應這項問題。

DynamoDB 是非關聯式資料庫，不支援資料表聯結。若您正在將現有應用程式從關聯式資料庫移轉至 DynamoDB，必須將您的資料模型去標準化，才不需聯結。

------
#### [ PartiQL for DynamoDB ]

借助 PartiQL，您可以使用 PartiQL `Select` 陳述式，使用 `ExecuteStatement` 操作讀取資料表的項目。

```
SELECT AlbumTitle, Year, Price
FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today'
```

請注意，此資料表的主索引鍵包含 Artist 和 SongTitle。

**注意**  
 PartiQL Select 陳述式也可以用來查詢或掃描 DynamoDB 資料表

如需使用 `Select` 和 `ExecuteStatement` 的程式碼範例，請參閱 [適用於 DynamoDB 的 PartiQL Select 陳述式](ql-reference.select.md)。

------

# 查詢資料表的差異
<a name="SQLtoNoSQL.ReadData.Query"></a>

資料庫常見的另一種存取模式是根據您的查詢條件，從資料表讀取多個項目。

**Topics**
+ [使用 SQL 查詢資料表](#SQLtoNoSQL.ReadData.Query.SQL)
+ [在 DynamoDB 中查詢資料表](#SQLtoNoSQL.ReadData.Query.DynamoDB)

## 使用 SQL 查詢資料表
<a name="SQLtoNoSQL.ReadData.Query.SQL"></a>

使用 SQL 時，`SELECT` 陳述式可讓您查詢索引鍵資料行、非索引鍵資料行或任何組合。`WHERE` 子句則可決定要傳回的資料列，如下列範例所示。

```
/* Return a single song, by primary key */

SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle = 'Call Me Today';
```

```
/* Return all of the songs by an artist */

SELECT * FROM Music
WHERE Artist='No One You Know';
```

```
/* Return all of the songs by an artist, matching first part of title */

SELECT * FROM Music
WHERE Artist='No One You Know' AND SongTitle LIKE 'Call%';
```

```
/* Return all of the songs by an artist, only if the price is less than 1.00 */

SELECT * FROM Music
WHERE Artist='No One You Know'
AND Price < 1.00;
```

請注意，此資料表的主索引鍵包含 *Artist* 和 *SongTitle*。

## 在 DynamoDB 中查詢資料表
<a name="SQLtoNoSQL.ReadData.Query.DynamoDB"></a>

在 Amazon DynamoDB 中，您可以使用 DynamoDB API 或 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (SQL 相容查詢語言) 查詢資料表中的項目。

------
#### [ DynamoDB API ]

若使用 Amazon DynamoDB，您可以使用 `Query` 操作以類似方式擷取資料。`Query` 操作可供您快速且有效率地存取存放資料的實體位置。如需詳細資訊，請參閱[DynamoDB 的分割區與資料分配](HowItWorks.Partitions.md)。

您可以對任何資料表或次要索引使用 `Query`。您必須為分割區索引鍵值指定相等條件，並可選擇性地為已定義的排序索引鍵屬性提供另一個條件。

`KeyConditionExpression` 參數指定您想要查詢的索引鍵值。您可以使用選用的 `FilterExpression`，在結果傳回之前從中移除特定的項目。

在 DynamoDB 中，您必須使用 `ExpressionAttributeValues` 作為表達式參數 (例如 `KeyConditionExpression` 及 `FilterExpression`) 中的預留位置。這與在關聯式資料庫中使用*繫結變數*類似，您會在執行時期將實際值代入 `SELECT` 陳述式。

請注意，此資料表的主索引鍵包含 *Artist* 和 *SongTitle*。

下列是一些 DynamoDB `Query` 範例。

```
// Return a single song, by primary key

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a and SongTitle = :t",
    ExpressionAttributeValues: {
        ":a": "No One You Know",
        ":t": "Call Me Today"
    }
}
```

```
// Return all of the songs by an artist

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a",
    ExpressionAttributeValues: {
        ":a": "No One You Know"
    }
}
```

```
// Return all of the songs by an artist, matching first part of title

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a and begins_with(SongTitle, :t)",
    ExpressionAttributeValues: {
        ":a": "No One You Know",
        ":t": "Call"
    }
}
```

```
// Return all of the songs by an artist, only if the price is less than 1.00

{
    TableName: "Music",
    KeyConditionExpression: "Artist = :a",
    FilterExpression: "Price < :p",
    ExpressionAttributeValues: {
        ":a": "No One You Know",
        ":p": 1.00
    }
}
```

**注意**  
`FilterExpression` 會在`Query`讀取相符項目後套用，因此不會減少使用的讀取容量。如果可能，請將您的資料建模，讓範圍條件在排序索引鍵`KeyConditionExpression`上使用，以實現有效率的查詢。如需詳細資訊，請參閱[在 DynamoDB 中查詢資料表](Query.md)。

------
#### [ PartiQL for DynamoDB ]

若使用 PartiQL，您可以藉由使用 `ExecuteStatement` 操作和 `Select` 陳述式對分割區索引鍵進行查詢。

```
SELECT AlbumTitle, Year, Price
FROM Music
WHERE Artist='No One You Know'
```

以此方式使用 `SELECT` 陳述式會傳回所有與此特定 `Artist` 相關聯的歌曲。

如需使用 `Select` 和 `ExecuteStatement` 的程式碼範例，請參閱 [適用於 DynamoDB 的 PartiQL Select 陳述式](ql-reference.select.md)。

------

# 掃描資料表的差異
<a name="SQLtoNoSQL.ReadData.Scan"></a>

在 SQL 中，沒有 `SELECT` 子句的 `WHERE` 陳述式會傳回資料表中的每個資料列。在 Amazon DynamoDB 中，`Scan` 操作會執行同樣的操作。在這兩種案例中，您可以擷取所有項目或部分項目。

無論是使用 SQL 或 NoSQL 資料庫，建議您謹慎使用掃描，因為掃描會使用大量系統資源。有時候適合掃描 (例如掃描小型資料表) 或必須掃描 (例如大量匯出資料)。但一般來說，您應將應用程式設計為避免執行掃描。如需詳細資訊，請參閱[在 DynamoDB 中查詢資料表](Query.md)。

**注意**  
執行大量匯出也會為每個分割區建立至少 1 個檔案。每個檔案的所有項目都來自該特定分割區的雜湊金鑰空間。

**Topics**
+ [使用 SQL 掃描資料表](#SQLtoNoSQL.ReadData.Scan.SQL)
+ [掃描 DynamoDB 中的資料表](#SQLtoNoSQL.ReadData.Scan.DynamoDB)

## 使用 SQL 掃描資料表
<a name="SQLtoNoSQL.ReadData.Scan.SQL"></a>

使用 SQL 時，您可以使用不指定 `WHERE` 子句的 `SELECT` 陳述式來掃描資料表，並擷取其中的所有資料。您可以在結果中請求一或多個資料行。或者，您可以使用萬用字元 (\$1) 請求所有資料行。

以下為使用 `SELECT` 陳述式的範例。

```
/* Return all of the data in the table */
SELECT * FROM Music;
```

```
/* Return all of the values for Artist and Title */
SELECT Artist, Title FROM Music;
```

## 掃描 DynamoDB 中的資料表
<a name="SQLtoNoSQL.ReadData.Scan.DynamoDB"></a>

在 Amazon DynamoDB 中，您可以使用 DynamoDB API 或 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (SQL 相容查詢語言) 對資料表執行掃描。

------
#### [ DynamoDB API ]

借助 DynamoDB API，可使用 `Scan` 操作，存取資料表中的每個項目或次要索引，以傳回一或多個項目和項目屬性。

```
// Return all of the data in the table
{
    TableName:  "Music"
}
```

```
// Return all of the values for Artist and Title
{
    TableName:  "Music",
    ProjectionExpression: "Artist, Title"
}
```

`Scan` 操作也提供了 `FilterExpression` 參數，您可以用它來捨棄不想要顯示在結果中的項目。`FilterExpression` 會在掃描完後並在結果傳回給您前套用。(此動作不建議與大型資料表一起使用。即使只傳回少量的符合項目，您仍須為整個 `Scan` 支付費用。)

------
#### [ PartiQL for DynamoDB ]

借助 PartiQL，您可以藉由使用 `ExecuteStatement` 操作並使用 `Select` 陳述式傳回資料表的所有內容。

```
SELECT AlbumTitle, Year, Price
FROM Music
```

請注意，此陳述式會傳回「Music」資料表中的所有項目。

如需使用 `Select` 和 `ExecuteStatement` 的程式碼範例，請參閱 [適用於 DynamoDB 的 PartiQL Select 陳述式](ql-reference.select.md)。

------

# 管理索引時，關聯式 (SQL) 資料庫與 DynamoDB 的差異
<a name="SQLtoNoSQL.Indexes"></a>

索引提供您替代的查詢模式，可加速查詢。本節會比較及比對 SQL 及 Amazon DynamoDB 中索引的建立及使用。

無論您是使用關聯式資料庫或 DynamoDB，都應明智地建立索引。每當寫入資料表時，資料表的所有索引都必須更新。在大型資料表的大量寫入環境中，這可能會使用大量系統資源。在唯讀或大部分讀取的環境中，這不算是問題。但是，您應確認應用程式確實使用了索引，而非只是占用空間。

**Topics**
+ [建立索引時，關聯式 (SQL) 資料庫與 DynamoDB 的差異](#SQLtoNoSQL.Indexes.Creating)
+ [查詢與掃描索引時，關聯式 (SQL) 資料庫與 DynamoDB 的差異](#SQLtoNoSQL.Indexes.QueryAndScan)

## 建立索引時，關聯式 (SQL) 資料庫與 DynamoDB 的差異
<a name="SQLtoNoSQL.Indexes.Creating"></a>

比較 SQL 中的 `CREATE INDEX` 陳述式及 Amazon DynamoDB 中的 `UpdateTable` 操作。

**Topics**
+ [使用 SQL 建立索引](#SQLtoNoSQL.Indexes.Creating.SQL)
+ [在 DynamoDB 中建立索引](#SQLtoNoSQL.Indexes.Creating.DynamoDB)

### 使用 SQL 建立索引
<a name="SQLtoNoSQL.Indexes.Creating.SQL"></a>

在關聯式資料庫中，索引是一種資料結構，可讓您快速查詢資料表中的不同資料行。您可以使用 `CREATE INDEX` SQL 陳述式對現有的資料表新增索引，並指定要編製索引的資料行。在索引建立後，您可以如常地查詢資料表中的資料，但資料庫現在已可使用索引在快速尋找資料表中的指定資料列，而不用掃描整個資料表。

在您建立索引後，資料庫會為您維護。每當您修改資料表中的資料時，索引就會自動修改，以反映資料表的變更。

在 MySQL 中，您會建立如下的索引。

```
CREATE INDEX GenreAndPriceIndex
ON Music (genre, price);
```

### 在 DynamoDB 中建立索引
<a name="SQLtoNoSQL.Indexes.Creating.DynamoDB"></a>

在 DynamoDB 中，您可以建立及使用*次要索引*來達到類似目的。

DynamoDB 中的索引與關聯式資料庫中的索引不同。在您建立次要索引時，必須指定其索引鍵屬性，即一個分割區索引鍵和一個排序索引鍵。在建立次要索引後，您便可以 `Query` 或 `Scan` 該索引，正如您對資料表所做的那樣。DynamoDB 沒有查詢最佳化程式，因此只有在您 `Query` 或 `Scan` 次要索引時才會使用此類索引。

DynamoDB 支援兩種不同的索引：
+ 全域次要索引：索引的主索引鍵可以是資料表中任兩個屬性。
+ 本機次要索引：索引的分割區索引鍵必須與資料表的分割區索引鍵相同。但是，排序索引鍵可以是其他任何屬性。

DynamoDB 會確認次要索引中的資料最終與其資料表一致。您可以對資料表或本機次要索引請求高度一致的 `Query` 或 `Scan` 操作。但是，全域次要索引只支援最終一致性。

您可以使用 `UpdateTable` 操作並指定 `GlobalSecondaryIndexUpdates`，對現有的資料表新增全域次要索引。

```
{
    TableName: "Music",
    AttributeDefinitions:[
        {AttributeName: "Genre", AttributeType: "S"},
        {AttributeName: "Price", AttributeType: "N"}
    ],
    GlobalSecondaryIndexUpdates: [
        {
            Create: {
                IndexName: "GenreAndPriceIndex",
                KeySchema: [
                    {AttributeName: "Genre", KeyType: "HASH"}, //Partition key
                    {AttributeName: "Price", KeyType: "RANGE"}, //Sort key
                ],
                Projection: {
                    "ProjectionType": "ALL"
                },
                ProvisionedThroughput: {                                // Only specified if using provisioned mode
                    "ReadCapacityUnits": 1,"WriteCapacityUnits": 1
                }
            }
        }
    ]
}
```

您必須提供下列參數給 `UpdateTable`：
+ `TableName`：會與索引相關聯的資料表。
+ `AttributeDefinitions`：索引之索引鍵結構描述屬性的資料類型。
+ `GlobalSecondaryIndexUpdates`：您想要建立之索引的相關詳細資訊：
  + `IndexName`：索引的名稱。
  + `KeySchema`：用於索引主索引鍵的屬性。
  + `Projection`：資料表中複製到索引的屬性。在此案例中，`ALL` 表示會複製所有屬性。
  + `ProvisionedThroughput (for provisioned tables)`：此索引所需的每秒讀取及寫入數。(這和資料表的佈建輸送量設定是分開的。) 

部分此操作會涉及將資料表中的資料回填到新的索引。在回填過程中，資料表仍可使用。但是，在索引的 `Backfilling` 屬性從 true 變更為 false 之前，索引都尚未就緒。您可以使用 `DescribeTable` 操作來檢視此屬性。

## 查詢與掃描索引時，關聯式 (SQL) 資料庫與 DynamoDB 的差異
<a name="SQLtoNoSQL.Indexes.QueryAndScan"></a>

比較在 SQL 中使用 SELECT 陳述式及在 Amazon DynamoDB 中使用 `Query` 及 `Scan` 操作查詢及掃描索引。

**Topics**
+ [在 SQL 中查詢及掃描索引](#SQLtoNoSQL.Indexes.QueryAndScan.SQL)
+ [在 DynamoDB 中查詢及掃描索引](#SQLtoNoSQL.Indexes.QueryAndScan.DynamoDB)

### 在 SQL 中查詢及掃描索引
<a name="SQLtoNoSQL.Indexes.QueryAndScan.SQL"></a>

在關聯式資料庫中，您不會直接使用索引。而是透過發出 `SELECT` 陳述式查詢資料表，然後查詢最佳化器就可使用任何索引。

*查詢最佳化器*是一項關聯式資料庫管理系統 (RDBMS) 元件，可評估可用的索引，並判斷是否可用其加速查詢。若索引可用來加速查詢，RDBMS 便會先存取索引，然後用它尋找資料表中的資料。

以下為一些可使用 *GenreAndPriceIndex* 改善效能的 SQL 陳述式。我們假設 *Music* 資料表具有足夠的資料，可讓查詢最佳化器決定使用此索引，而非單純地掃描整個資料表。

```
/* All of the rock songs */

SELECT * FROM Music
WHERE Genre = 'Rock';
```

```
/* All of the cheap country songs */

SELECT Artist, SongTitle, Price FROM Music
WHERE Genre = 'Country' AND Price < 0.50;
```

### 在 DynamoDB 中查詢及掃描索引
<a name="SQLtoNoSQL.Indexes.QueryAndScan.DynamoDB"></a>

在 DynamoDB 中，您可以直接在索引上執行 `Query` 和 `Scan` 操作，與您在資料表上的操作方式相同。您可以使用 DynamoDB API 或 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (SQL 相容查詢語言) 來查詢或掃描索引。您必須同時指定 `TableName` 和 `IndexName`。

下列是關於 DynamoDB 中 *GenreAndPriceIndex* 的部分查詢。(此索引的索引鍵結構描述包含 *Genre* 和 *Price*)。

------
#### [ DynamoDB API ]

```
// All of the rock songs

{
    TableName: "Music",
    IndexName: "GenreAndPriceIndex",
    KeyConditionExpression: "Genre = :genre",
    ExpressionAttributeValues: {
        ":genre": "Rock"
    },
};
```

此範例使用 `ProjectionExpression` 指出您只想要在結果中顯示部分屬性，而非所有屬性。

```
// All of the cheap country songs

{
    TableName: "Music",
    IndexName: "GenreAndPriceIndex",
    KeyConditionExpression: "Genre = :genre and Price < :price",
    ExpressionAttributeValues: {
        ":genre": "Country",
        ":price": 0.50
    },
    ProjectionExpression: "Artist, SongTitle, Price"
};
```

下列是對 *GenreAndPriceIndex* 執行的掃描。

```
// Return all of the data in the index

{
    TableName:  "Music",
    IndexName: "GenreAndPriceIndex"
}
```

------
#### [ PartiQL for DynamoDB ]

使用 PartiQL，您可以使用 PartiQL `Select` 陳述式對索引執行查詢和掃描。

```
// All of the rock songs

SELECT * 
FROM Music.GenreAndPriceIndex
WHERE Genre = 'Rock'
```

```
// All of the cheap country songs

SELECT * 
FROM Music.GenreAndPriceIndex
WHERE Genre = 'Rock' AND Price < 0.50
```

下列是對 *GenreAndPriceIndex* 執行的掃描。

```
// Return all of the data in the index

SELECT *
FROM Music.GenreAndPriceIndex
```

**注意**  
如需使用 `Select` 的程式碼範例，請參閱 [適用於 DynamoDB 的 PartiQL Select 陳述式](ql-reference.select.md)。

------

# 修改資料表資料時，關聯式 (SQL) 資料庫與 DynamoDB 的差異
<a name="SQLtoNoSQL.UpdateData"></a>

SQL 語言會提供 `UPDATE` 陳述式來修改資料。Amazon DynamoDB 使用 `UpdateItem` 操作來完成類似的任務。

**Topics**
+ [修改 SQL 資料表中的資料](#SQLtoNoSQL.UpdateData.SQL)
+ [修改 DynamoDB 中資料表的資料](#SQLtoNoSQL.UpdateData.DynamoDB)

## 修改 SQL 資料表中的資料
<a name="SQLtoNoSQL.UpdateData.SQL"></a>

在 SQL 中，您會使用 `UPDATE` 陳述式修改一或多列。`SET` 子句可為一或多個資料行指定新的值，`WHERE` 子句則可決定要修改的資料列。下列是 範例。

```
UPDATE Music
SET RecordLabel = 'Global Records'
WHERE Artist = 'No One You Know' AND SongTitle = 'Call Me Today';
```

若沒有任何資料列符合 `WHERE` 子句，`UPDATE` 陳述式便沒有任何效果。

## 修改 DynamoDB 中資料表的資料
<a name="SQLtoNoSQL.UpdateData.DynamoDB"></a>

在 DynamoDB 中，您可以使用 DynamoDB API 或 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (SQL 相容查詢語言) 修改單一項目。如果您想要修改多個項目，則必須使用多個操作。

------
#### [ DynamoDB API ]

若使用 DynamoDB API，您可以使用 `UpdateItem` 操作修改單一項目。

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET RecordLabel = :label",
    ExpressionAttributeValues: {
        ":label": "Global Records"
    }
}
```

您必須指定要修改之項目的 `Key` 屬性，以及 `UpdateExpression` 以指定屬性值。`UpdateItem` 的運作方式類似「upsert」操作。如果項目存在資料表中，則會進行更新，如果不存在，則會新增 (插入) 新項目。

`UpdateItem` 支援*條件式寫入*，即只有在特定 `ConditionExpression` 評估為 true 時，操作才會成功。例如，若歌曲的價格未大於或等於 2.00，下列 `UpdateItem` 操作就不會執行更新。

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET RecordLabel = :label",
    ConditionExpression: "Price >= :p",
    ExpressionAttributeValues: {
        ":label": "Global Records",
        ":p": 2.00
    }
}
```

`UpdateItem` 也支援*原子計數器*，或可增加或減少的 `Number` 類型屬性。原子計數器與 SQL 資料庫中的順序產生器、身分欄位或自動遞增欄位在許多方面都非常類似。

下列是 `UpdateItem` 操作的範例，它會初始化新屬性 (*Plays*) 來追蹤歌曲的播放次數。

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET Plays = :val",
    ExpressionAttributeValues: {
        ":val": 0
    },
    ReturnValues: "UPDATED_NEW"
}
```

`ReturnValues` 參數會設為 `UPDATED_NEW`，這會傳回任何更新屬性的新值。在此案例中，它會傳回 0 (零)。

只要有人播放此歌曲，我們就可以使用下列 `UpdateItem` 操作將 *Plays* 增加 1。

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET Plays = Plays + :incr",
    ExpressionAttributeValues: {
        ":incr": 1
    },
    ReturnValues: "UPDATED_NEW"
}
```

------
#### [ PartiQL for DynamoDB ]

借助 PartiQL，您可以使用 PartiQL `Update` 陳述式，使用 `ExecuteStatement` 操作修改資料表中的項目。

此資料表的主索引鍵包含 *Artist* 和 *SongTitle*。您必須指定這些屬性的值。

```
UPDATE Music
SET RecordLabel ='Global Records'
WHERE Artist='No One You Know' AND SongTitle='Call Me Today'
```

您也可以一次修改多個欄位，如以下範例所示。

```
UPDATE Music
SET RecordLabel = 'Global Records'
SET AwardsWon = 10
WHERE Artist ='No One You Know' AND SongTitle='Call Me Today'
```

`Update` 也支援*原子計數器*，或可增加或減少的 `Number` 類型屬性。原子計數器與 SQL 資料庫中的順序產生器、身分欄位或自動遞增欄位在許多方面都非常類似。

以下為 `Update` 陳述式的示例，用以初始化新的屬性 (*Plays*) 來追蹤歌曲的播放次數。

```
UPDATE Music
SET Plays = 0
WHERE Artist='No One You Know' AND SongTitle='Call Me Today'
```

當某人播放此歌曲時，我們即可使用下列 `Update` 陳述式將 *Plays* 增加 1。

```
UPDATE Music
SET Plays = Plays + 1
WHERE Artist='No One You Know' AND SongTitle='Call Me Today'
```

**注意**  
如需使用 `Update` 和 `ExecuteStatement` 的程式碼範例，請參閱 [適用於 DynamoDB 的 PartiQL Update 陳述式](ql-reference.update.md)。

------

# 從資料表刪除資料時，關聯式 (SQL) 資料庫與 DynamoDB 的差異
<a name="SQLtoNoSQL.DeleteData"></a>

在 SQL 中，`DELETE` 陳述式會從資料表中移除一或多個資料列。Amazon DynamoDB 會使用 `DeleteItem` 操作一次刪除一個項目。

**Topics**
+ [從 SQL 資料表刪除資料](#SQLtoNoSQL.DeleteData.SQL)
+ [從 DynamoDB 中的資料表刪除資料](#SQLtoNoSQL.DeleteData.DynamoDB)

## 從 SQL 資料表刪除資料
<a name="SQLtoNoSQL.DeleteData.SQL"></a>

在 SQL 中，您可使用 `DELETE` 陳述式刪除一或多個資料列。`WHERE` 子句則可決定您想要修改的資料列。下列是 範例。

```
DELETE FROM Music
WHERE Artist = 'The Acme Band' AND SongTitle = 'Look Out, World';
```

您可修改 `WHERE` 子句來刪除多個資料列。例如，您可以刪除特定演出者的所有歌曲，如下所示。

```
DELETE FROM Music WHERE Artist = 'The Acme Band'
```

## 從 DynamoDB 中的資料表刪除資料
<a name="SQLtoNoSQL.DeleteData.DynamoDB"></a>

在 DynamoDB 中，您可以使用 DynamoDB API 或 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html) (SQL 相容查詢語言) 刪除單一項目。如果您想要修改多個項目，則必須使用多個操作。

------
#### [ DynamoDB API ]

若使用 DynamoDB API，您會使用 `DeleteItem` 操作從資料表中刪除資料，一次刪除一個項目。您必須指定項目的主索引鍵值。

```
{
    TableName: "Music",
    Key: {
        Artist: "The Acme Band",
        SongTitle: "Look Out, World"
    }
}
```

**注意**  
除了 `DeleteItem` 之外，Amazon DynamoDB 還支援 `BatchWriteItem` 操作，可讓您同時刪除多個項目。

`DeleteItem` 支援*條件式寫入*，即只有在特定 `ConditionExpression` 評估為 true 時，操作才會成功。例如，下列 `DeleteItem` 操作只會刪除具有 *RecordLabel* 屬性的項目。

```
{
    TableName: "Music",
    Key: {
        Artist: "The Acme Band",
        SongTitle: "Look Out, World"
    },
   ConditionExpression: "attribute_exists(RecordLabel)"
}
```

------
#### [ PartiQL for DynamoDB ]

借助 PartiQL，您可以使用 `Delete` 陳述式透過 `ExecuteStatement` 操作從資料表刪除資料，一次刪除一個項目。您必須指定項目的主索引鍵值。

此資料表的主索引鍵包含 *Artist* 和 *SongTitle*。您必須指定這些屬性的值。

```
DELETE FROM Music
WHERE Artist = 'Acme Band' AND SongTitle = 'PartiQL Rocks'
```

您也可以為操作指定其他條件。以下 `DELETE` 操作僅刪除具有超過 11 個 *Awards* (獎項) 的項目。

```
DELETE FROM Music
WHERE Artist = 'Acme Band' AND SongTitle = 'PartiQL Rocks' AND Awards > 11
```

**注意**  
如需使用 `DELETE` 和 `ExecuteStatement` 的程式碼範例，請參閱 [適用於 DynamoDB 的 PartiQL Delete 陳述式](ql-reference.delete.md)。

------

# 移除資料表時，關聯式 (SQL) 資料庫與 DynamoDB 的差異
<a name="SQLtoNoSQL.RemoveTable"></a>

在 SQL 中，您可使用 `DROP TABLE` 陳述式移除資料表。在 Amazon DynamoDB 中，您可以使用 `DeleteTable` 操作。

**Topics**
+ [移除 SQL 資料表](#SQLtoNoSQL.RemoveTable.SQL)
+ [移除 DynamoDB 中的資料表](#SQLtoNoSQL.RemoveTable.DynamoDB)

## 移除 SQL 資料表
<a name="SQLtoNoSQL.RemoveTable.SQL"></a>

當您不再需要某個資料表，並想要永久將它捨棄時，您會在 SQL 中使用 `DROP TABLE` 陳述式。

```
DROP TABLE Music;
```

資料表捨棄後，便無法復原。(某些關聯式資料庫的確可讓您復原 `DROP TABLE` 操作，但這屬於廠商專屬的功能，並未廣泛實作)。

## 移除 DynamoDB 中的資料表
<a name="SQLtoNoSQL.RemoveTable.DynamoDB"></a>

在 DynamoDB 中，`DeleteTable` 是類似的操作。在下列範例中，資料表會永久刪除。

```
{
    TableName: "Music"
}
```

# Amazon DynamoDB 學習資源與工具
<a name="AdditionalResources"></a>

您可以使用下列其他資源，協助您了解及使用 DynamoDB。

**Topics**
+ [寫程式和視覺化工具](#AdditionalResources.Tools)
+ [規範性指引文章](#AdditionalResources.PrescriptiveGuidance)
+ [知識中心文章](#AdditionalResources.KnowledgeCenter)
+ [部落格文章、儲存庫和指南](#AdditionalResources.Guides)
+ [資料建模和設計模式簡報](#AdditionalResources.DataModeling)
+ [培訓課程](#AdditionalResources.Training)

## 寫程式和視覺化工具
<a name="AdditionalResources.Tools"></a>

您可以使用下列程式撰寫和視覺化工具來搭配 DynamoDB 使用：
+ [Amazon DynamoDB 專用 NoSQL Workbench](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.html)：一種統一的視覺化工具，可協助您設計、建立、查詢和管理 DynamoDB 資料表。其提供資料建模、資料視覺化和查詢開發功能。
+ [Dynobase](https://dynobase.dev/)：此桌面工具可讓您輕鬆查看和使用 DynamoDB 資料表、建立應用程式程式碼，以及透過即時驗證來編輯紀錄。
+ [DynamoDB 工具箱](https://github.com/jeremydaly/dynamodb-toolbox)：由 Jeremy Daly 開發的專案，提供實用工具，協助進行資料建模及在 JavaScript 與 Node.js 中操作。
+ [DynamoDB Streams 處理器](https://github.com/jeremydaly/dynamodb-streams-processor)：此簡易工具可以簡化使用 [DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) 的作業。

## 規範性指引文章
<a name="AdditionalResources.PrescriptiveGuidance"></a>

AWS 方案指引提供經過時間測試的策略、指南和模式，以協助加速您的專案。這些資源是由 AWS 技術專家和 AWS 合作夥伴的全球社群所開發，以其多年協助客戶實現業務目標的經驗為基礎。

**資料建模與移轉**
+ [DynamoDB 階層式資料模型](https://docs.aws.amazon.com/prescriptive-guidance/latest/dynamodb-hierarchical-data-model/introduction.html)
+ [使用 DynamoDB 建立資料模型](https://docs.aws.amazon.com/prescriptive-guidance/latest/dynamodb-data-modeling/welcome.html)
+ [使用 將 Oracle 資料庫遷移至 DynamoDB AWS DMS](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-an-oracle-database-to-amazon-dynamodb-using-aws-dms.html)

**全域資料表**
+ [使用 Amazon DynamoDB 全域資料表](https://docs.aws.amazon.com/prescriptive-guidance/latest/dynamodb-global-tables/introduction.html)

**無伺服器**
+ [使用 實作無伺服器 saga 模式 AWS Step Functions](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/implement-the-serverless-saga-pattern-by-using-aws-step-functions.html)

**SaaS 架構**
+ [透過單一控制平面管理多個 SaaS 產品的租用戶](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/manage-tenants-across-multiple-saas-products-on-a-single-control-plane.html)
+ [在 SaaS 架構中使用 C\$1 和 AWS CDK 進行筒倉模型的租用戶上線](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk.html)

**資料保護與資料移動**
+ [設定對 Amazon DynamoDB 的跨帳戶存取權](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html)
+ [適用於 DynamoDB 的完整資料表複製選項](https://docs.aws.amazon.com/prescriptive-guidance/latest/dynamodb-full-table-copy-options/)
+ [AWS 的資料庫災難復原策略](https://docs.aws.amazon.com/prescriptive-guidance/latest/strategy-database-disaster-recovery/)

**Miscellaneous (其他)**
+ [協助在 DynamoDB 中強制執行標記](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/help-enforce-dynamodb-tagging.html)

**規範性指引影片逐步解說**
+ [使用無伺服器架構建立資料管道](https://youtu.be/JiWHomdh1oI?)
+ [Novartis - Buying Engine：人工智慧採購入口網站](https://youtu.be/vp8oPiHN4cA)
+ [Veritiv：啟用 Insights 以預測 AWS 資料湖上的銷售需求](https://youtu.be/jg85DzUZ9Ac)
+ [mimik：混合邊緣雲端利用 AWS 來支援邊緣微服務網格](https://youtu.be/-S-R7MWRpaI)
+ [使用 Amazon DynamoDB 變更資料擷取](https://youtu.be/6YVjzD-70p4)

如需 DynamoDB 的其他規範性指引文章和影片，請參閱[規範性指引](https://tiny.amazon.com/fiui3cog/ForinternaldemoofnewpageExternalURLwillbeneededforlive)。

## 知識中心文章
<a name="AdditionalResources.KnowledgeCenter"></a>

 AWS 知識中心文章和影片涵蓋了我們從 AWS 客戶收到的最常見問題和請求。以下是關於與 DynamoDB 相關之特定工作的最新知識中心文章：

**成本最佳化**
+ [如何使用 Amazon DynamoDB 最佳化成本？](https://repost.aws/knowledge-center/dynamodb-optimize-costs)

**限流和延遲**
+ [如何疑難排解 Amazon DynamoDB 資料表的高延遲問題？](https://repost.aws/knowledge-center/dynamodb-high-latency)
+ [為什麼我的 DynamoDB 資料表會被限流？](https://repost.aws/knowledge-center/dynamodb-table-throttled)
+ [為什麼我的隨選 DynamoDB 資料表會被限流？](https://repost.aws/knowledge-center/on-demand-table-throttling-dynamodb)

**分頁**
+ [如何在 DynamoDB 中實作分頁](https://repost.aws/knowledge-center/dynamodb-implement-pagination)

**交易**
+ [為什麼我的 `TransactWriteItems` API 調用在 DynamoDB 中失敗](https://repost.aws/knowledge-center/dynamodb-transactwriteitems)

**疑難排解**

[]()
+ [如何解決 DynamoDB 自動擴展的問題？](https://repost.aws/knowledge-center/dynamodb-auto-scaling)
+ [如何疑難排解 DynamoDB 中的 HTTP 4XX 錯誤](https://repost.aws/knowledge-center/usererrors-dynamodb-table)

如需 DynamoDB 的其他文章和影片，請參閱[知識中心文章](https://repost.aws/search/knowledge-center?globalSearch=dynamodb)。

## 部落格文章、儲存庫和指南
<a name="AdditionalResources.Guides"></a>

除了 [DynamoDB 開發人員指南](Introduction.md)之外，還有許多有用的資源可協助使用 DynamoDB。以下是使用 DynamoDB 的精選部落格文章、儲存庫和指南：
+ AWS 各種 AWS SDK 語言的 [DynamoDB 程式碼範例](https://github.com/aws-samples/aws-dynamodb-examples)儲存庫：[Node.js](https://github.com/aws-samples/aws-dynamodb-examples/tree/master/examples/SDK/node.js)、[Java](https://github.com/aws-samples/aws-dynamodb-examples/tree/master/examples/SDK/java)、[Python](https://github.com/aws-samples/aws-dynamodb-examples/tree/master/examples/SDK/python)、[.Net](https://github.com/aws-samples/aws-dynamodb-examples/tree/master/examples/SDK/dotnet)、[Go](https://github.com/aws-samples/aws-dynamodb-examples/tree/master/examples/SDK/golang) 和 [Rust](https://github.com/aws-samples/aws-dynamodb-examples/tree/master/examples/SDK/rust)。
+ [DynamoDB 說明書](https://www.dynamodbbook.com/)：由 [Alex DeBrie](https://twitter.com/alexbdebrie) 提供的全面指南，教導使用 DynamoDB 進行資料模型的策略導向方法。
+ [DynamoDB 指南](https://www.dynamodbguide.com/)：由 [Alex DeBrie](https://twitter.com/alexbdebrie) 提供的入門指南，逐步引導 DynamoDB NoSQL 資料庫的基本概念和進階功能。
+ [如何透過 20 個簡單步驟從 RDBMS 轉換至 DynamoDB](https://www.jeremydaly.com/how-to-switch-from-rdbms-to-dynamodb-in-20-easy-steps/)：[Jeremy Daly](https://twitter.com/jeremy_daly) 提供的學習資料建模實用步驟清單。
+ [DynamoDB JavaScript DocumentClient 速查表](https://github.com/dabit3/dynamodb-documentclient-cheat-sheet)：此速查表可協助您在 Node.js 或 JavaScript 環境中開始使用 DynamoDB 建置應用程式。
+ [DynamoDB 核心概念影片](https://www.youtube.com/playlist?list=PLJo-rJlep0EDNtcDeHDMqsXJcuKMcrC5F)：此播放清單涵蓋許多 DynamoDB 的核心概念。

## 資料建模和設計模式簡報
<a name="AdditionalResources.DataModeling"></a>

您可以使用以下關於資料建模和設計模式的資源，以協助您充分利用 DynamoDB：
+ [AWS re：Invent 2019：使用 DynamoDB 建立資料模型](https://www.youtube.com/watch?v=DIQVJqiSUkE) 
  + 觀看 [Alex DeBrie](https://twitter.com/alexbdebrie) 的演講，開始認識 DynamoDB 資料建模的原則。
+ [AWS re：Invent 2020：DynamoDB 的資料建模 – 第 1 部分](https://www.youtube.com/watch?v=fiP2e-g-r4g)
+ [AWS re：Invent 2020：DynamoDB 的資料建模 – 第 2 部分](https://www.youtube.com/watch?v=0uLF1tjI_BI)
+ [AWS re：Invent 2017：進階設計模式](https://www.youtube.com/watch?v=jzeKPKpucS0)
+ [AWS re：Invent 2018：進階設計模式](https://www.youtube.com/watch?v=HaEPXoXVf2k)
+ [AWS re：Invent 2019：進階設計模式](https://www.youtube.com/watch?v=6yqfmXiZTlM)
  + Jeremy Daly 分享了他在本次會議中提到的 [12 個重要結論](https://www.jeremydaly.com/takeaways-from-dynamodb-deep-dive-advanced-design-patterns-dat403/)。
+ [AWS re:Invent 2020：DynamoDB 進階設計模式 (第 1 部分)](https://www.youtube.com/watch?v=MF9a1UNOAQo&index=1)
+ [AWS re：Invent 2020：DynamoDB 進階設計模式 – 第 2 部分](https://www.youtube.com/watch?v=_KNrRdWD25M&index=2)
+ [Twitch 上的 DynamoDB 辦公時間](https://amazondynamodbofficehrs.splashthat.com/)

**注意**  
每個會議涵蓋不同的使用案例和範例。

## 培訓課程
<a name="AdditionalResources.Training"></a>

有許多不同的培訓課程和教育選項，可讓您進一步了解 DynamoDB。以下是一些目前的範例：
+ [ 使用 Amazon DynamoDB 開發 – ](https://www.aws.training/Details/Curriculum?id=65583)由 設計 AWS ，可將您從初學者帶到使用 Amazon DynamoDB 資料建模開發真實世界應用程式的專家。
+ [DynamoDB 深入課程](https://www.pluralsight.com/courses/aws-dynamodb-deep-dive-2019)：Pluralsight 課程。
+ [Amazon DynamoDB：建置 NoSQL 資料庫驅動的應用程式](https://www.edx.org/course/amazon-dynamodb-building-nosql-database-driven-app) – 來自 edX 上託管 AWS 的訓練和認證團隊的課程。