Composite Key Index
適用性: BigTable 數據庫。
(9) 鍵組合聚合 Aggregation with Composite Keys
Composite keys 鍵組合技術并不僅僅可以用來做索引,同樣可以用來區分不用的類型的數據以支持數據分組??紤]一個例子,我們有一個海量的日志數組,這個日志記錄了互聯網上的用戶的訪問來源。我們需要計算從某一網站過來的獨立訪客的數量,在關系型數據庫中,我們可能需要下面這樣的SQL查詢語句:
1
|
SELECT count ( distinct (user_id)) FROM clicks GROUP BY site |
我們可以在NoSQL中建立如下的數據模型:
Counting Unique Users using Composite Keys
這樣,我們就可以把數據按UserID來排序,我們就可以很容易把同一個用戶的數據(一個用戶并不會產生太多的event)進行處理,去掉那些重復的站點(使用hash table或是別的什么)。另一個可選的技術是,我們可以對每一個用戶建立一個數據實體,然后把其站點來源追加到這個數據實體中,當然,這樣一來,數據的更新在性能相比之下會有一定損失。
適用性: Ordered Key-Value Store 排序鍵值對數據庫, BigTable風格的數據庫。
(10) 反轉搜索 Inverted Search – 直接聚合 Direct Aggregation
這個技術更多的是數據處理技術,而不是數據建模技術。盡管如此,這個技術還是會影響數據模型。這個技術最主要的想法是使用一個索引來找到滿足某條件的數據,但是把數據聚合起需要使用全文搜索。還是讓我們來說一個示例。還是用上面那個例子,我們有很多的日志,其中包括互聯網用戶和他們的訪問來源。讓我們假定每條記錄都有一個UserID,還有用戶的種類 (Men, Women, Bloggers, 等),以及用戶所在的城市,和訪問過的站點。我們要干的事是,為每個用戶種類找到滿足某些條件(訪問源,所在城市,等)的的獨立用戶。
很明顯,我們需要搜索那些滿足條件的用戶,如果我們使用反轉搜索,這會讓我們把這事干得很容易,如: {Category -> [user IDs]} 或 {Site -> [user IDs]}。使用這樣的索引, 我們可以取兩個或多個UserID要的交集或并集(這個事很容易干,而且可以干得很快,如果這些UserID是排好序的)。但是,我們要按用戶種類來生成報表會變得有點麻煩,因為我們用語句可能會像下面這樣
1
|
SELECT count ( distinct (user_id)) ... GROUP BY category |
但這樣的SQL很沒有效率,因為category數據太多了。為了應對這個問題,我們可以建立一個直接索引 {UserID -> [Categories]} 然后我們用它來生成報表:
Counting Unique Users using Inverse and Direct Indexes
最后,我們需要明白,對每個UserID的隨機查詢是很沒有效率的。我們可以通過批查詢處理來解決這個問題。這意味著,對于一些用戶集,我們可以進行預處理(不同的查詢條件)。
適用性: Key-Value Store 鍵值對數據庫, Document Databases文檔數據庫, BigTable風格的數據庫。
層級式模型 Hierarchy Modeling Techniques
(11) 樹形聚合Tree Aggregation
樹形或是任意的圖(需反規格化)可以被直接打成一條記錄或文檔存放。
當樹形結構被一次性取出時這會非常有效率(如:我們需要展示一個blog的樹形評論)
搜索和任何存取這個實體都會存在問題。
對于大多數NoSQL的實現來說,更新數據都是很不經濟的(相比起獨立結點來說)
Tree Aggregation
適用性: Key-Value 鍵值對數據庫, Document Databases 文檔數據庫
(12) 鄰接列表 Adjacency Lists
Adjacency Lists 鄰接列表是一種圖 – 每一個結點都是一個獨立的記錄,其包含了 所有的父結點或子結點。這樣,我們就可以通過給定的父或子結點來進行搜索。當然,我們需要通過hop查詢遍歷圖。這個技術在廣度和深度查詢,以及得到某個結點的子樹上沒有效率。
原文轉自:http://www.anti-gravitydesign.com