DynamoDB 是一個你什么也不用管的 NoSql 數據庫。記得給 AWS付賬單就可以。
在2004年的時候, Amazon 發現 Oracle 數據庫都不夠用了。為了還能繼續做生意。 AWS設計了一個 Key-Vale 存儲系統。以希望能達到以下目的:高性能,可擴展性,可靠性。
DynamoDB是分布式數據庫,設計成用來解決數據庫管理、性能、可擴展性和可靠性等核心問題。開發人員可以創建一個數據庫表,該表可以存儲和檢索任何數量的數據。
DynamoDB 用起來很簡單,因為它的功能很簡單,你想一個 Key-value 能什么花頭可以搞的, 以至於你感覺它基本上沒用處。 特別是你發現市場上 kev-value 的數據庫已經多的性況下。如果你非要說好,也怕只有:你開箱就用,不需要自己去維護什么。要記得給錢。
Dynamodb 會說你在最開始做產品的開發的的時候,要用戶沒用戶,要功能沒功能,所以關系型數據庫不合適,因為你不知道有什么 schema。 但是 DynamoDB 對你可能更沒有用。因為根據它的文檔:你只能對你的產品需求很熟悉的時候,你才能設計好表的 Partion key和Sort key, 以及 primary key。 從這個角度來說,還不如 MySQL。
什么是DynamoDB
Amazon DynamoDB 是一種完全托管的 NoSQL 數據庫服務,提供快速而可預測的性能,能夠實現無縫擴展。DynamoDB 可以從表中自動刪除過期的項,從而幫助您降低存儲用量,減少用於存儲不相關數據的成本。
DynamoDB工作原理
在DynamoDB中核心組件是表、項目和屬性。表是項目的集合,項目是屬性的集合,DynamoDB使用主鍵來標識表中的每個項目,還提供了二級索引來提供更大的查詢靈活性,還可以使用DynamoDB流來捕獲DynamoDB表中的數據修改事件。
表、項目和屬性
- 表 DynamoDB將數據存儲在表中,表是某類數據的集合,例如People表、Cars表。
- 項目 每個表包含多個項目,項目是一組屬性,具有不同於所有其他項目的唯一標識,項目類似與SQL中的行、記錄或元組。
- 屬性 每個項目包含一個或多個屬性,屬性是基本的數據元素,屬性類似與SQL中的字段或列。
People表示例
- 表中每個項目都有一個唯一的標識符或主鍵(PersonID)用於將項目和表中的其他內容區分開來
- 除主鍵外,People表是無架構的,這表示屬性和其數據類型都不需要預先定義,每個項目都能有自己獨特的屬性
- 大部分屬性屬於標量類型,這意味着它們只能有一個值,例如字符串或數字
- 某些項目具有嵌套屬性(People表中的Address),DynamoDB最高支持32級深度的嵌套屬性
Music表示例


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

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


此示例中最后一位客戶將不會收到電子郵件,因為他沒有 EmailAddress屬性。
除了觸發器之外,DynamoDB流還提供更強大的解決方案,例如AWS區域內或跨區域數據復制,DynamoDB表中的數據具體化視圖,使用Kinesis具體化視圖的數據分析等。
作者:OceanDog
鏈接:https://www.jianshu.com/p/e29fadb018f4
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。