Atomic Aggregates
當然,原子聚合 Atomic Aggregates 這種數據模型并不能實現完全意義上的事務處理,但是如果支持原子性,鎖,或 test-and-set 指令,那么, Atomic Aggregates 是可以適用的。
適用性: Key-Value Store 鍵值對數據庫, Document Databases文檔數據庫, BigTable風格的數據庫。
(5) 可枚舉鍵 Enumerable Keys
也許,對于無順序的Key-Value最大的好處是業務實體可以被容易地hash以分區在多個服務器上。而排序了的key會把事情搞復雜,但是有些時候,一個應用能從排序key中獲得很多好處,就算是數據庫本身不提供這個功能。讓我們來思考下email消息的數據模型:
一些NoSQL的數據庫提供原子計數器以允許生一些連續的ID。在這種情況下,我們可以使用 userID_messageID 來做為一個組合key。如果我們知道最新的message ID,就可以知道前一個message,也可能知道再前面和后面的Message。
Messages可以被打包。比如,每天的郵件包。這樣,我們就可以對郵件按指定的時間段來遍歷。
適用性: Key-Value Store 鍵值對數據庫。
(6) 降維 Dimensionality Reduction
Dimensionality Reduction 降維是一種技術可以允許把一個多維的數據映射成一個Key-Value或是其它非多給的數據模型。
傳統的地理位置信息系統使用一些如“四分樹QuadTree” 或 “R-Tree” 來做地理位置索引。這些數據結構的內容需要被在適當的位置更新,并且,如果數據量很大的話,操作成本會很高。另一個方法是我們可以遍歷一個二維的數據結構并把其扁平化成一個列表。一個眾所周知的例子是Geohash(地理哈希)。一個Geohash使用“之字形”的路線掃描一個2維的空間,而且遍歷中的移動可以被簡單地用0和1來表示其方向,然后在移動的過程中產生0/1串。下圖展示了這一算法:(陳皓注:先把地圖分成四份,經度為第一位,緯度為第二位,于是左邊的經度是0,右邊的是1,緯度也一樣,上面是為1,下面的為0,這樣,經緯度就可以組合成01,11,00,10這四個值,其標識了四塊區域,我們可以如此不斷的遞歸地對每個區域進行四分,然后可以得到一串1和0組成的字串,然后使用0-9,b-z 去掉(去掉a, i, l, o)這32個字母進行base32編碼得到一個8個長度的編碼,這就是Geohash的算法)
Geohash Index
Geohash的最強大的功能是使用簡單的位操作就可以知道兩個區域間的距離,就像圖中所示(陳皓:proximity框著的那兩個,這個很像IP地址了)。Geohash把一個二維的坐標生生地變成了一個一維的數據模型,這就是降維技術。BigTable的降維技術參看到文章后面的 [6.1]。更多的關于Geohash和其它技術可以參看 [6.2] 和 [6.3]。
適用性: Key-Value Store 鍵值對數據庫, Document Databases文檔數據庫, BigTable風格的數據庫。
(7) 索引表 Index Table
Index Table 索引表是一個非常直白的技術,其可以你在不支持索引的數據庫中得到索引的好處。BigTable是這類最重要的數據庫。這需要我們維護一個有相應存取模式的特別表。例如,我們有一個主表存著用戶帳號,其可以被UserID存取。某查詢需要查出某個城市里所有的用戶,于是我們可以加入一張表,這張表用城市做主鍵,所有和這個城市相關的UserID是其Value,如下所示:
Index Table Example
可見,城市索引表的需要和對主表用戶表保持一致性,因此,主表的每一個更新可能需要對索引表進行更新,不然就是一個批處理更新。無論哪個方式,這都會損傷一些性能,因為需要保持一致性。
Index Table 索引表可以被認為是關系型數據庫中的視圖的等價物。
適用性: BigTable 數據庫。
(8) 鍵組合索引 Composite Key Index
Composite key 鍵組合是一個很常用的技術,對此,當我們的數據庫支持鍵排序時能得到極大的好處。Composite key組合鍵的拼接成為第二排序字段可以讓你構建出一種多維索引,這很像我們之前說過的 Dimensionality Reduction 降維技術。例如,我們需要存取用戶統計。如果我們需要根據不同的地區來統計用戶的分布情況,我們可以把Key設計成這樣的格式 (State:City:UserID),這樣一來,就使得我們可以通過State到City來按組遍歷用戶,特別是我們的NoSQL數據庫支持在key上按區查詢(如:BigTable類的系統):
1
2
|
SELECT Values WHERE state= "CA:*" SELECT Values WHERE city= "CA:San Francisco*" |
原文轉自:http://www.anti-gravitydesign.com