Amazon DynamoDB 的核心元件 - Amazon DynamoDB

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

Amazon DynamoDB 的核心元件

在 DynamoDB 中,資料表、項目與屬性都是您會用到的核心元件。資料表項目的集合,而每個項目則是屬性的集合。DynamoDB 使用主索引鍵來唯一識別資料表中的各個項目和次要索引,以便提供更多的查詢靈活性。您可以使用 DynamoDB Streams 來擷取 DynamoDB 資料表中的資料修改事件。

DynamoDB 中有其限制。如需詳細資訊,請參閱Amazon DynamoDB 中的服務、帳戶和資料表配額

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

資料表、項目與屬性

資料表、項目與屬性

每個 DynamoDB 表格都包含零個或多個由一個或多個屬性組成的項目。

以下是基本 DynamoDB 元件:

  • 資料表:與其他資料庫系統類似,DynamoDB 會將資料存放在資料表中。資料表是資料的集合。例如,您可以使用名為 People 的資料表範例,來存放朋友、家人或其他任何人的相關個人聯絡資訊。您也可以使用 Cars 資料表來存放各人駕駛之車輛的相關資訊。

  • 項目:每個資料表包含零或多個項目。項目是可從所有其他項目唯一識別的一組屬性。在 People 資料表中,每個項目代表一個人。在 Cars 資料表中,每個項目代表一輛車。DynamoDB 中的項目與其他資料庫系統中的資料列、紀錄或元組有許多相似之處。在 DynamoDB 中,可以存放在資料表中的項目數不限。

  • 屬性:每個項目是由一或多個屬性所組成。屬性是一種基本資料元素,不必再進一步細分。例如,「人員」表格中的項目包含稱為 PersonIDLastNameFirstName、等的屬性。在 Department 資料表中,項目可能會有 DepartmentIDNameManager 等屬性。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 資料表的注意事項如下:

  • 音樂的主鍵包含兩個屬性(藝術家SongTitle)。資料表中的每個項目必須有這兩個屬性。藝術家的組合,並從所有SongTitle其他表中的每個項目區分開來。

  • 除了主索引鍵之外,Music 資料表沒有結構描述,這表示您不需要事先定義屬性或其資料類型。每個項目可以有其專屬的不同屬性。

  • 其中一個項目具有巢狀屬性 (PromotionInfo),其中包含其他巢狀屬性。DynamoDB 支援巢狀屬性,最多 32 層深。

如需詳細資訊,請參閱 在 DynamoDB 中使用資料表和資料

主索引鍵

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

DynamoDB 支援兩種不同類型的主索引鍵:

  • 分割區索引鍵:簡易主索引鍵,由一個屬性 (稱為分割區索引鍵) 所組成。

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

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

    所以 資料表、項目與屬性 中描述的 People 資料表,是具有簡單主索引鍵 (PersonID) 的資料表範例。您可以透過提供該項目的PersonId值,直接存取「人員」(People) 表格中的任何項目。

  • 分割區索引鍵與排序索引鍵:稱為複合主索引鍵,這種類型的索引鍵是由兩個屬性組成。第一個屬性是分割區索引鍵,第二個屬性是排序索引鍵

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

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

    中描述的「音樂」資料表資料表、項目與屬性是具有複合主索引鍵 (ArtistSongTitle) 的表格範例。如果您提供出者和該項目的SongTitle值,則可以直接存取「音樂」表中的任何項目。

    複合主索引鍵可讓您更有彈性地查詢資料。例如,如果您只提供 Artist 值,則 DynamoDB 會擷取該演出者的所有歌曲。若只要擷取特定演出者的一部分歌曲,您可以為演出者提供值以及的值範圍SongTitle

注意

項目的分割區索引鍵也稱為其雜湊屬性雜湊屬性一詞衍生自 DynamoDB 中內部雜湊函數的用法,可將資料項目根據其分割區索引鍵值平均分佈到所有分割區。

項目的排序索引鍵也稱為其範圍屬性範圍屬性一詞衍生自 DynamoDB 存放項目的方式,具有相同分割區索引鍵的項目會實際緊密相鄰,並依排序索引鍵值排序。

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

次要索引

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

DynamoDB 支援兩種索引:

  • 全域次要索引:一種含分割區索引鍵或排序索引鍵的索引,這些索引鍵可與資料表上的索引鍵不同。

  • 本機次要索引:是一種與資料表擁有相同分區索引鍵但不同排序索引鍵的索引。

在 DynamoDB 中,全域次要索引 (GSIs) 是跨越整個表格的索引,可讓您跨所有分區索引鍵進行查詢。本機次要索引 (LSIs) 是與基底資料表具有相同分割索引鍵但排序索引鍵不同的索引鍵。

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

在先前顯示的「音樂」資料表範例中,您可以依照演出者 (分割區索引鍵) 或術家SongTitle(分割索引鍵和排序索引鍵) 來查詢資料項目。如果您還想按流派和查詢數據怎麼AlbumTitle辦? 要做到這一點,你可以創建一個類型的索引 AlbumTitle,然後查詢索引的方式大致相同的方式,你會查詢音樂表。

下圖顯示了示例音樂表,名為一個新的索引GenreAlbumTitle。在索引中,「類型」是分割索引鍵,而且AlbumTitle是排序索引鍵。

音樂資料表 GenreAlbumTitle
{ "Artist": "No One You Know", "SongTitle": "My Dog Spot", "AlbumTitle": "Hey Now", "Price": 1.98, "Genre": "Country", "CriticRating": 8.4 }
{ "Genre": "Country", "AlbumTitle": "Hey Now", "Artist": "No One You Know", "SongTitle": "My Dog Spot" }
{ "Artist": "No One You Know", "SongTitle": "Somewhere Down The Road", "AlbumTitle": "Somewhat Famous", "Genre": "Country", "CriticRating": 8.4, "Year": 1984 }
{ "Genre": "Country", "AlbumTitle": "Somewhat Famous", "Artist": "No One You Know", "SongTitle": "Somewhere Down The Road" }
{ "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" } }
{ "Genre": "Rock", "AlbumTitle": "The Buck Starts Here", "Artist": "The Acme Band", "SongTitle": "Still In Love" }
{ "Artist": "The Acme Band", "SongTitle": "Look Out, World", "AlbumTitle": "The Buck Starts Here", "Price": 0.99, "Genre": "Rock" }
{ "Genre": "Rock", "AlbumTitle": "The Buck Starts Here", "Artist": "The Acme Band", "SongTitle": "Look Out, World" }

請注意下列有關GenreAlbumTitle索引的事項:

  • 每個索引都屬於一個資料表,稱為索引的基礎資料表。在上述範例中,Music 是索GenreAlbumTitle引的基底資料表。

  • DynamoDB 會自動維護索引。當您新增、更新或刪除基礎資料表中的項目時,DynamoDB 會在屬於該資料表的任何索引中新增、更新或刪除對應的項目。

  • 建立索引時,您可以指定要從基礎資料表複製或投影到索引的屬性。DynamoDB 至少會將索引鍵屬性從基礎資料表投影到索引。GenreAlbumTitle 即為一例,其中只有索引鍵屬性會從 Music 資料表投影到索引。

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

如需詳細資訊,請參閱 使用次要索引來改善資料存取

DynamoDB Streams

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

每個事件是以串流紀錄表示。如果您在資料表上啟用串流,只要發生下列其中一個事件,DynamoDB Streams 就會寫入一個串流紀錄:

  • 新增項目至資料表:串流會擷取整個項目的影像,包括其所有屬性。

  • 項目已更新:串流會擷取項目中已修改之任何屬性的「之前」與「之後」影像。

  • 從資料表刪除項目:串流會擷取整個項目的影像,再加以刪除。

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

您可以搭配使用 DynamoDB Streams AWS Lambda 創建一個觸發器 —code,每當有興趣的事件出現在流中時自動運行。例如,以含有公司客戶資訊的 Customers 資料表為例。假設您想要傳送「歡迎」電子郵件給每個新客戶。您可以在該資料表上啟用串流,然後將串流與 Lambda 函數建立關聯。Lambda 函數會在每次出現新的串流紀錄時執行,但只會處理 Customers 資料表的新增項目。對於任何具有EmailAddress屬性的項目,Lambda 函數都會叫用 Amazon 簡易電子郵件服務 (AmazonSES),將電子郵件傳送至該地址。

整合 DynamoDB Streams 和 Lambda,以自動傳送歡迎電子郵件給新客戶。
注意

在此範例中,最後一個客戶 Craig Roe 不會收到電子郵件,因為他沒有EmailAddress

除了觸發器之外,DynamoDB Streams 還支援功能強大的解決方案,例如在內部和之間複製資料 AWS 區域、DynamoDB 表中資料的具體化視觀表、使用 Kinesis 具體化視觀表的資料分析等等。

如需詳細資訊,請參閱DynamoDB Streams 的變更資料擷取