重要槪念
SDB基本結構圖如圖3-21所示。

SDB基本結構圖中包含了SDB中以下幾個最重要的概念。
1.用戶賬戶(CustomerAccout)
使用任何Amazon的云計算服務都需要一個Amazon的賬戶,SDB也不例外。用戶賬戶就相當于全集,而具體的數據庫則相當于子集。
2.域(Domain)
域是數據容器,由于SDB的數據都是以UTF-8編碼的字符串形式存儲的,因此域是具有一定關聯關系的字符串容器。用戶賬戶中的域名必須是唯一的且域名長度至少為3個字符,最長不能超過255個字符。SDB對于域的限制比較寬松,根據規定,一個賬戶可以最多擁有100個域,而每個域的大小則可以達到10GB。創建域的目的一般來說是將不同特征的數據分開,有些數據本身就具有可分性,我們可以直接將其劃分在不同的域, 而像Web數據這類本身不好劃分的數據Amazon建議利用哈希函數將其散列到不同的域中。不過在哈希函數的選擇時一定要慎重,因為哈希函數一個很大的問題就是散列地址沖突,在數據集較大時頻繁地處理沖突問題會使效率大大降低。SDB的數據庫操作都是以域為基本單位的,即所有的査詢都只可以在一個域內進行,域間操作是不允許的。這是-個比較麻煩的限制,從目前來看,Amazon并沒有要解除這個限制的跡象,因此只能由客戶端自行解決這個問題。在非必要的情況下最好不要創建新的域,一方面是跨域操作的限制,另一方面是由于建域消耗的時間和相關資源較多。
3.條目(Item)
條目就是一個實際的對象,在SDB中,用一系列的屬性來描述這個對象,也就是說條目是屬性的集合,而且條目名必須是域內唯一的。SDB不需要事先定義相關的模式(Schema),這是SDB和傳統的數據庫最大的不同之一。正因為這種差異使得SDB在操作上具有極大的靈活性,用戶可以隨時創建、刪除以及修改條目的內容。條目和條目之間可以屬于一類,也可以是完全不相關的兩類,這在關系數據庫一般也是不允許出現的。
4.屬性(Attribute)
屬性是條目的特征,它是一個抽象的概念,每個屬性都是對條目某一個方面特性的概括性描述。每個條目可以有多個屬性,SDB將域內的屬性總數限制為10億。屬性的操作也是異常自由的,當某個條目有新的屬性時只需要簡單地將這個新屬性添加進去即可,不用考慮這個屬性和其他的條目是否相關。
5.值(Value)
每個條目的某個屬性的具體內容就是值,每個條目的所有值可以使用戶對于該條目有一個具體、形象的了解。SDB的值相對于關系數據庫而言有一個很實用的改進,那就是允許多值屬性。關系數據庫中一個字段是不允許有多個值的,但在現實生活中這種情況卻是經常發生。比如有兩個計算機鍵盤,它們除了顏色是黑色和白色的區別之外其他參數完全一致,在SDB中我們就可以很方便地在顏色屬性這一欄中填入黑色、白色而不用擔心出錯。需要特別注意的是,每個屬性值的大小不能超過1KB,這個限制使得SDB存儲的數據范圍極其有限。出現這種情況應該是Amazon刻意為之,Amazon希望用戶將相對大的數據存儲在S3中,在SDB中只保存指向某個特定文件位置的指針。
SDB和關系型數據庫有很多相同之處,但也有很大的不同,用戶在決定使用SDB時絕不能簡單地將SDB和關系型數據庫做類比。其實嚴格地說,如果將傳統的關系數據庫看成一張張表,SDB更像我們平時常接觸到的文件夾的樹狀結構而不是表結構。圖3-22顯示了SDB的樹狀組織方式。

除了這種結構上的根本性差異外,SDB為了系統的高可用性采取了最終一致性數據模型。SDB還對每次操作設定了一個超時值(目前是5秒),當操作超過這個時間時,系統就會向用戶返回一個錯誤。同時SDB也對關系數據庫做了一些有益的改進,比如當用戶創建數據庫后,SDB會自動對用戶添加的數據進行索引,這樣在查詢某些數據時速度會大大加快。