數據模型概念 - Tables, Items, and Attributes
DynamoDB數據庫有表(tables),數據項(items)和屬性(attributes)構成。一個數據庫有若干張tables,一張表有若干items,每個數據項有若干attributes。
在關系型數據庫中,一張tables有columns組成。每個records都有相同的屬性。然而DynamoDB是NoSQL數據庫。也就是除了主鍵外,每個item都是可以任意自定義的,沒有columns的概念,也不受其束縛。唯一的要求就是不要每個item不要超過64 KB大小。這就是所有item name和item value加起來的大小不要超過64 KB。
每個item的attribute都是key-value的結構。每個attribute的value部分既可以使單值(single-valued)也可以是個組合(multi-value)。如果是組合的話,這個集合(set)中值是不允許有重復的。
我們來看一個例子,我們的網上商店,為了保存商品,我們這樣的tables結構:
Products( id, ...)
有個主鍵來標識這本書,然后用attributes來描述這本書的細節,比如:
{ Id = 101 ProductName = "Book 101 Title" ISBN = "111-1111111111" Authors = [ "Author 1", "Author 2" ] Price = -2 Dimensions = "8.5 x 11.0 x 0.5" PageCount = 500 InPublication = 1 ProductCategory = "Book" } { Id = 201 ProductName = "18-Bicycle 201" Description = "201 description" BicycleType = "Road" Brand = "Brand-Company A" Price = 100 Gender = "M" Color = [ "Red", "Black" ] ProductCategory = "Bike" } { Id = 202 ProductName = "21-Bicycle 202" Description = "202 description" BicycleType = "Road" Brand = "Brand-Company A" Price = 200 Gender = "M" Color = [ "Green", "Black" ] ProductCategory = "Bike" }
注意商品Book的Aurthors和Bike的Color屬性,它們就是multi-value。這是一種類似JSON的結構(JSON-like)。需要注意的是DynamoDB不允許atrributes的value為空(null)或空字符串(empty string)。
主鍵 – Primary Key
當你創建表格時,除了表名(table name)以外還需要一個主鍵。DynamoDB支持下面兩種主鍵(primary keys):
*Hash類型的主鍵:
主鍵是某個attribute的hash值。DynamoDB會為這個主鍵atrributes創建一個unordered hash index。上例中Product有個id作為主鍵。他是這張表Hash屬性(attributes)。
*Hash and Range類型的主鍵:
主鍵是兩個attribute組合而成。第一個屬性是hash attributes。第二個屬性是range attribute。DynamoDB會在hash attribute上創建一個unordered hash index,在range attribute上創建一個sorted range index。例如,Amazon維護了一些論壇,每個論壇有許多討論話題(threads),每個thread又有許多回復(replies)。你可能這樣設計表格:
Thread和Reply表都有hash & range類型主鍵。對Thread表來說,每個forum都有若干個subjects。這樣ForumName就可以做hash atrribute,subject就可以做range attribute。注意,你必須考慮到,DynamoDB並不支持表格間的join查詢。例如你必須在Reply表的id中保存ForumName和subject。這樣你就可以parse這個id來查找相應的Forum和Subject。
DynamoDB的數據類型
DynamoDB支持兩種數據類型:
1,標量(scalar) —— 數字(Number)或字符串(String)
2,多值組合(multi-valued) —— 數字的組合(Number set)或字符串的組合(String set)
字符串 是以二進制UTF8來編碼的。主鍵以外的字符串的大小沒有什么限制。當然不能超過item大小(64 KB)。可以參見Limits in Amazon DynamoDB。
當你使用Scan或Query接口來返回一個有序的結果時會用到字符串的比較。字符串的比較是基於ASCII值的比較。
數字 是正的或負的整數或小數。小數可以精確到小數點后38位。序列化后的數字是以String類型來傳給DynamoDB的,然而DynamoDB當數字一樣處理它們。
字符串集和數字集 需要注意的就是集合中不可以有重復的值,另外集合也是無序的
Reference
http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/DataModel.html