什么是DynamoDB
Amazon DynamoDB 是一種完全托管的 NoSQL 數(shù)據(jù)庫服務(wù),提供快速而可預(yù)測的性能,能夠?qū)崿F(xiàn)無縫擴展。DynamoDB 可以從表中自動刪除過期的項,從而幫助您降低存儲用量,減少用于存儲不相關(guān)數(shù)據(jù)的成本。
DynamoDB工作原理
在DynamoDB中核心組件是表、項目和屬性。表是項目的集合,項目是屬性的集合,DynamoDB使用主鍵來標(biāo)識表中的每個項目,還提供了二級索引來提供更大的查詢靈活性,還可以使用DynamoDB流來捕獲DynamoDB表中的數(shù)據(jù)修改事件。
表、項目和屬性
- 表 DynamoDB將數(shù)據(jù)存儲在表中,表是某類數(shù)據(jù)的集合,例如People表、Cars表。
- 項目 每個表包含多個項目,項目是一組屬性,具有不同于所有其他項目的唯一標(biāo)識,項目類似與SQL中的行、記錄或元組。
-
屬性 每個項目包含一個或多個屬性,屬性是基本的數(shù)據(jù)元素,屬性類似與SQL中的字段或列。
People表示例
- 表中每個項目都有一個唯一的標(biāo)識符或主鍵(PersonID)用于將項目和表中的其他內(nèi)容區(qū)分開來
- 除主鍵外,People表是無架構(gòu)的,這表示屬性和其數(shù)據(jù)類型都不需要預(yù)先定義,每個項目都能有自己獨特的屬性
- 大部分屬性屬于標(biāo)量類型,這意味著它們只能有一個值,例如字符串或數(shù)字
- 某些項目具有嵌套屬性(People表中的Address),DynamoDB最高支持32級深度的嵌套屬性
Music表示例

- 與People表不同的是,Music表的項目主鍵有兩個屬性(Artist和SongTitle),表中的每個項目都必須包含這兩個屬性,Artist和SongTitle屬性的組合用于將表中的每個項目區(qū)分開來
主鍵
創(chuàng)建表時除了指定表名外還必須指定表的主鍵,主鍵用于唯一標(biāo)識表中的每一個項目,任意兩個項目的主鍵都不能相同。
DynamoDB支持兩種類型的主鍵:
- 分區(qū)鍵 簡單的主鍵由一個分區(qū)鍵的屬性構(gòu)成,表中的每個項目都必須有不同的分區(qū)鍵值,分區(qū)鍵值用于DynamoDB內(nèi)部散列(Hash)函數(shù)的輸入,散列函數(shù)的輸出決定將項目存儲到哪個分區(qū)中。
-
分區(qū)鍵和排序鍵 也稱復(fù)合鍵,該類型的主鍵由兩個屬性組成, 第一個屬性是分區(qū)鍵,第二個屬性是排序鍵,分區(qū)鍵決定存儲位置,具有相同分區(qū)鍵的項目按照排序鍵的值排序然后順序存儲在一起。在具有分區(qū)鍵和排序鍵的表中兩個項目可能有相同的分區(qū)鍵值,但是必須有不同的排序鍵值。
注意
每個主鍵屬性必須為標(biāo)量,主鍵屬性的數(shù)據(jù)類型只能是字符串、數(shù)字和二進(jìn)制。
二級索引
可以在表上建立一個或多個二級索引,利用二級索引,除了可以用主鍵進(jìn)行查詢外,還可以使用替代鍵查詢表中的數(shù)據(jù)。
DynamoDB支持兩種索引:
- 全局二級索引(Global secondary index) 一種可能帶有與表中不同的分區(qū)鍵和排序鍵的索引
- 本地二級索引(Local secondary index) 一種分區(qū)鍵與表中的相同但排序鍵與表中不同的索引
每個表最多可以定義5個全局二級索引和5個本地二級索引。
前面的Music示例表中可以按Artist(分區(qū)鍵)或按Artist和SongTitle(分區(qū)鍵和排序鍵)進(jìn)行數(shù)據(jù)查詢。若要按Genre和AlbumTitle查詢數(shù)據(jù)要該怎么做?
這時我們可以在Genre和AlbumTitle上創(chuàng)建一個二級索引,然后通過相同的方式查詢索引。
下面的Music示例表包含了一個名為GenreAlbumTitle的新索引,索引中Genre是分區(qū)鍵,AlbumTitle是排序鍵。

- 每一個索引屬于一個表(稱為索引的基表),上面Music是GenreAlbumTitle索引的基表.
- DynamoDB會自動維護(hù)索引,當(dāng)你添加、更新或刪除基表中的某個項目時,DynamoDB會自動添加、更新或刪除屬于該表的任何索引中的對應(yīng)項目
- 在創(chuàng)建索引時可以指定哪些屬性將從基表復(fù)制或投影到索引。不指定的情況下DynamoDB至少也會將鍵屬性投影到索引中,如上面所示,此時GenreAlbumTitle索引中至少有Music表中的鍵屬性(Artist和SongTitle)
DynamoDB流
DynamoDB是一項可選功能,它用于捕獲DynamoDB表中的數(shù)據(jù)修改事件。有關(guān)這些事件的數(shù)據(jù)將按事件發(fā)生的順序近乎實時的出現(xiàn)在流中。
每個事件由一條流記錄表示,若對表啟用了流,每當(dāng)以下事件之一 發(fā)生時,DynamoDB流都會寫入一條流記錄:
- 如果向表中添加了新項目,流將捕獲整個項目的映像(包括其所有屬性)
- 如果更新了項目,流將捕獲項目中任何已修改屬性的"之前"和"之后"映像
- 如果從表中刪除了項目,流將在整個項目被刪除前捕獲其映像
每條流記錄還包含表名稱、事件時間戳和其他元數(shù)據(jù)。流記錄的有效事件為24小時,過此事件后記錄將被自動刪除
擴展
DynamoDB流可以和AWS Lambda結(jié)合使用以創(chuàng)建觸發(fā)器,即在流中有你感興趣的事件出現(xiàn)時自動執(zhí)行Lambda中的代碼。
例如,假設(shè)有一個包含某公司客戶信息的 Customers 表。假設(shè)你希望向每位新客戶發(fā)送一封“歡迎”電子郵件。你可對該表啟用一個流,然后將該流與 Lambda 函數(shù)關(guān)聯(lián)。Lambda 函數(shù)將在有新項目添加到Customers表的流記錄發(fā)生時執(zhí)行。若該新項目有EmailAddress屬性,Lambda 函數(shù)將調(diào)用 Amazon Simple Email Service (Amazon SES) 以向該地址發(fā)送電子郵件。

此示例中最后一位客戶將不會收到電子郵件,因為他沒有EmailAddress屬性。
除了觸發(fā)器之外,DynamoDB流還提供更強大的解決方案,例如AWS區(qū)域內(nèi)或跨區(qū)域數(shù)據(jù)復(fù)制,DynamoDB表中的數(shù)據(jù)具體化視圖,使用Kinesis具體化視圖的數(shù)據(jù)分析等。
