適用性: Key-Value 鍵值對數據庫, Document Databases 文檔數據庫
(13) Materialized Paths
Materialized Paths 可以幫助避免遞歸遍歷(如:樹形結構)。這個技術也可以被認為是反規格化的一種變種。其想法是為每個結點加上父結點或子結點的標識屬性,這樣就可以不需要遍歷就知道所有的后裔結點和祖先結點了:
Materialized Paths for eShop Category Hierarchy
這個技術對于全文搜索引擎來說非常有幫助,因為其可以允許把一個層級結構轉成一個文檔。上面的示圖中我們可以看到所有的商品或Men’s Shoes下的子分類可以被一條很短的查詢語句處理——只需要給定個分類名。
Materialized Paths 可以存儲一個ID的集合,或是一堆ID拼出的字符串。后者允許你通過一個正則表達式來搜索一個特定的分支路徑。下圖展示了這個技術(分支的路徑包括了結點本身):
Query Materialized Paths using RegExp
適用性: Key-Value 鍵值對數據庫, Document Databases 文檔數據, Search Engines 搜索引擎
(14) 嵌套集 Nested Sets
Nested sets 嵌套集是樹形結構的標準技術。它被廣泛地用在了關系性數據庫中,它完全地適用于 Key-Value 鍵值對數據庫 和 Document Databases 文檔數據庫。這個技術的想法是把葉子結點存儲成一個數組,并通過使用索引的開始和結束來映射每一個非葉子結點到一個葉子結點集,就如下圖所示一樣:
Modeling of eCommerce Catalog using Nested Sets
這樣的數據結構對于immutable data不變的數據 有非常不錯的效率,因為其點內存空間小,并且可以很快地找出所有的葉子結點而不需要樹的遍歷。盡管如此,在插入和更新上需要很高的性能成本,因為新的葉子結點需要大規模地更新索引。
適用性: Key-Value Stores 鍵值數據庫, Document Databases 文檔數據庫
(15) 嵌套文檔扁平化:有限的字段名 Nested Documents Flattening: Numbered Field Names
搜索引擎基本上來說和扁平文檔一同工作,如:每一個文檔是一個扁平的字段和值的例表。這種數據模型的用來把業務實體映射到一個文本文檔上,如果你的業務實體有很復雜的內部結構,這可能會變得很有挑戰。一個典型的挑戰是把一個有層級的文檔映映射出來。例如,文檔中嵌套另一個文檔。讓我們看看下面的示例:
Nested Documents Problem
上面的每一個業務實體代碼一種簡歷。其包括了人名和一個技能列表。我把這個層級文檔映射成一個文本文檔,一種方法是創建 Skill 和 Level 字段。這個模型可以通過技術或是等級來搜索一個人,而上圖標注的那樣的組合查詢則會失敗。(陳皓注:因為分不清Excellent是否是Math還是Poetry上的)
在引用中的 [4.6] 給出了一種解決方案。其為每個字段都標上數字 Skill_i 和 Level_i,這樣就可以分開搜索每一個對(下圖中使用了OR來遍歷查找所有可能的字段):
Nested Document Modeling using Numbered Field Names
這樣的方式根本沒有擴展性,對于一些復雜的問題來說只會讓代碼復雜度和維護工作變大。
適用性: Search Engines 全文搜索
(16)嵌套文檔扁平化:鄰近查詢 Nested Documents Flattening: Proximity Queries
在附錄 [4.6]中給出了這個技術用來解決扁平層次文檔。它用鄰近的查詢來限制可被查詢的單詞的范圍。下圖中,所有的技能和等級被放在一個字段中,叫 SkillAndLevel,查詢中出現的 “Excellent” 和 “Poetry” 必需一個緊跟另一個:
Nested Document Modeling using Proximity Queries
附錄 [4.3] 中講述了這個技術被用在Solr中的一個成功案例。
適用性: Search Engines 全文搜索
(17) 圖結構批處理 Batch Graph Processing
Graph databases 圖數據庫,如 neo4j 是一個出眾的圖數據庫,尤其是使用一個結點來探索鄰居結點,或是探索兩個或少量結點前的關系。但是處理大量的圖數據是很沒有效率的,因為圖數據庫的性能和擴展性并不是其目的。分布式的圖數據處理可以被 MapReduce 和 Message Passing pattern 來處理。如: 在我前一篇的文章中的那個示例。這個方法可以讓 Key-Value stores, Document databases, 和 BigTable-style databases 適合于處理大圖。
Applicability: Key-Value Stores, Document Databases, BigTable-style Databases
參考
Finally, I provide a list of useful links related to NoSQL data modeling:
Key-Value Stores:
http://www.devshed.com/c/a/MySQL/Database-Design-Using-KeyValue-Tables/
http://antirez.com/post/Sorting-in-key-value-data-model.html
http://stackoverflow.com/questions/3554169/difference-between-document-based-and-key-value-based-databases
http://dbmsmusings.blogspot.com/2010/03/distinguishing-two-major-types-of_29.html
BigTable-style Databases:
原文轉自:http://www.anti-gravitydesign.com