精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

NoSQL 數(shù)據(jù)建模技術詳解

運維 系統(tǒng)運維
NoSQL 數(shù)據(jù)庫經(jīng)常被用作很多非功能性的地方,如,擴展性,性能和一致性的地方。這些NoSQL的特性在理論和實踐中都正在被大眾廣泛地研究著,研究的熱點正是那些和性能分布式相關的非功能性的東西,我們都知道 CAP 理論被很好地應用于了 NoSQL 系統(tǒng)中(陳皓注:CAP即,一致性(Consistency), 可用性(Availability), 分區(qū)容忍性(Partition tolerance),在分布式系統(tǒng)中,這三個要素最多只能同時實現(xiàn)兩個,而NoSQL一般放棄的是一致性)。

NoSQL 數(shù)據(jù)庫經(jīng)常被用作很多非功能性的地方,如,擴展性,性能和一致性的地方。這些NoSQL的特性在理論和實踐中都正在被大眾廣泛地研究著,研究的熱點正是那些和性能分布式相關的非功能性的東西,我們都知道 CAP 理論被很好地應用于了 NoSQL 系統(tǒng)中(陳皓注:CAP即,一致性(Consistency), 可用性(Availability), 分區(qū)容忍性(Partition tolerance),在分布式系統(tǒng)中,這三個要素最多只能同時實現(xiàn)兩個,而NoSQL一般放棄的是一致性)。但在另一方面,NoSQL的數(shù)據(jù)建模技術卻因為缺乏像關系型數(shù)據(jù)庫那樣的基礎理論沒有被世人很好地研究。這篇文章從數(shù)據(jù)建模方面對NoSQL家族進行了比較,并討論幾個常見的數(shù)據(jù)建模技術。

要開始討論數(shù)據(jù)建模技術,我們不得不或多或少地先系統(tǒng)地看一下NoSQL數(shù)據(jù)模型的成長的趨勢,以此我們可以了解一些他們內在的聯(lián)系。下圖是NoSQL家族的進化圖,我們可以看到這樣的進化:Key-Value時代,BigTable時代,Document時代,全文搜索時代,和Graph數(shù)據(jù)庫時代:(陳皓注:注意圖中SQL說的那句話,NoSQL再這樣發(fā)展下去就是SQL了,哈哈。)


NoSQL Data Models#p#

首先,我們需要注意的是SQL和關系型數(shù)據(jù)模型已存在了很長的時間,這種面向用戶的自然性意味著:

  • 最終用戶一般更感興趣于數(shù)據(jù)的聚合顯示,而不是分離的數(shù)據(jù),這主要通過SQL來完成。
  • 我們無法通過人手工控制數(shù)據(jù)的并發(fā)性,完整性,一致性,或是數(shù)據(jù)類型校驗這些東西的。這就是為什么SQL需要在事務,二維表結構(schema)和外表聯(lián)合上做很多事。

另一方面,SQL可以讓軟件應用程序在很多情況下不需要關心數(shù)據(jù)庫的數(shù)據(jù)聚合,和數(shù)據(jù)完整性和有效性進行控制。而如果我們去除了數(shù)據(jù)一致性,完整性這些東西,會對性能和分布存儲有著重的幫助。正因為如此,我們才有數(shù)據(jù)模型的進化:

  • Key-Value 鍵值對存儲是非常簡單而強大的。下面的很多技術基本上都是基于這個技術開始發(fā)展的。但是,Key-Value有一個非常致命的問題,那就是如果我們需要查找一段范圍內的key。(陳皓注:學過hash-table數(shù)據(jù)結構的人都應該知道,hash-table是非序列容器,其并不像數(shù)組,鏈接,隊列這些有序容器,我們可以控制數(shù)據(jù)存儲的順序)。于是,有序鍵值 (Ordered Key-Value) 數(shù)據(jù)模型被設計出來解決這一限制,來從根本上提高數(shù)據(jù)集的問題。
  • Ordered Key-Value 有序鍵值模型也非常強大,但是,其也沒有對Value提供某種數(shù)據(jù)模型。通常來說,Value的模型可以由應用負責解析和存取。這種很不方便,于是出現(xiàn)了 BigTable類型的數(shù)據(jù)庫,這個數(shù)據(jù)模型其實就是map里有map,map里再套map,一層一層套下去,也就是層層嵌套的key-value(value里又是一個key-value),這種數(shù)據(jù)庫的Value主要通過“列族”(column families),列,和時間戳來控制版本。(陳皓注:關于時間戳來對數(shù)據(jù)的版本控制主要是解決數(shù)據(jù)存儲并發(fā)問題,也就是所謂的樂觀鎖,詳見《多版本并發(fā)控制(MVCC)在分布式系統(tǒng)中的應用》)
  • Document databases 文檔數(shù)據(jù)庫 改進了 BigTable 模型,并提供了兩個有意義的改善。***個是允許Value中有主觀的模式(scheme),而不是map套map。第二個是索引。 Full Text Search Engines 全文搜索引擎可以被看作是文檔數(shù)據(jù)庫的一個變種,他們可以提供靈活的可變的數(shù)據(jù)模式(scheme)以及自動索引。他們之間的不同點主要是,文檔數(shù)據(jù)庫用字段名做索引,而全文搜索引擎用字段值做索引。
  • Graph data models 圖式數(shù)據(jù)庫 可以被認為是這個進化過程中從 Ordered Key-Value 數(shù)據(jù)庫發(fā)展過來的一個分支。圖式數(shù)據(jù)庫允許構建議圖結構的數(shù)據(jù)模型。它和文檔數(shù)據(jù)庫有關系的原因是,它的很多實現(xiàn)允許value可以是一個map或是一個document。#p#

 NoSQL 數(shù)據(jù)模型摘要

本文剩下的章節(jié)將向你介紹數(shù)據(jù)建模的技術實現(xiàn)和相關模式。但是,在介紹這些技術之前,先來一段序言:

  • NoSQL 數(shù)據(jù)模型設計一般從業(yè)務應用的具體數(shù)據(jù)查詢入手,而不是數(shù)據(jù)間的關系:
    • 關系型的數(shù)據(jù)模型基本上是分析數(shù)據(jù)間的結構和關系。其設計理念是: ”What answers do I have?”
    • NoSQL 數(shù)據(jù)模型基本上是從應用對數(shù)據(jù)的存取方式入手,如:我需要支持某種數(shù)據(jù)查詢。其設計理念是 ”What questions do I have?”
  • NoSQL 數(shù)據(jù)模型設計比關系型數(shù)據(jù)庫需要對數(shù)據(jù)結構和算法的更深的了解。在這篇文章中我會和大家說那些盡人皆知的數(shù)據(jù)結構,這些數(shù)據(jù)結構并不只是被NoSQL使用,但是對于NoSQL的數(shù)據(jù)模型卻非常有幫助。
  • 數(shù)據(jù)冗余和反規(guī)格化是一等公民。
  • 關系型數(shù)據(jù)庫對于處理層級數(shù)據(jù)和圖式數(shù)據(jù)非常的不方便。NoSQL用來解決圖式數(shù)據(jù)明顯是一個非常好的解決方案,幾乎所有的NoSQL數(shù)據(jù)庫可以很強地解決此類問題。這就是為什么這篇文章專門拿出一章來說明層級數(shù)據(jù)模型。
下面是NoSQL的分類表,也是我用來寫這篇文章時做實踐的產(chǎn)品:
  • Key-Value 存儲: Oracle Coherence, Redis, Kyoto Cabinet
  • 類BigTable存儲: Apache HBase, Apache Cassandra
  • 文檔數(shù)據(jù)庫: MongoDB, CouchDB
  • 全文索引: Apache Lucene, Apache Solr
  • 圖數(shù)據(jù)庫: neo4j, FlockDB

概念技術 Conceptual Techniques

這一節(jié)主要介紹NoSQL數(shù)據(jù)模型的基本原則。

(1) 反規(guī)格化 Denormalization

反規(guī)格化 Denormalization 可以被認為是把相同的數(shù)據(jù)拷貝到不同的文檔或是表中,這樣就可以簡化和優(yōu)化查詢,或是正好適合用戶的某中特別的數(shù)據(jù)模型。這篇文章中所說的絕大多數(shù)技術都或多或少地導向了這一技術。

總體來說,反規(guī)格化需要權衡下面這些東西:

  • 查詢數(shù)據(jù)量 /查詢IO  VS  總數(shù)據(jù)量。使用反規(guī)格化,一方面可以把一條查詢語句所需要的所有數(shù)據(jù)組合起來放到一個地方存儲。這意味著,其它不同不同查詢所需要的相同的數(shù)據(jù),需要放在別不同的地方。因此,這產(chǎn)生了很多冗余的數(shù)據(jù),從而導致了數(shù)據(jù)量的增大。
  • 處理復雜度  VS 總數(shù)據(jù)量. 在符合范式的數(shù)據(jù)模式上進行表連接的查詢,很顯然會增加了查詢處理的復雜度,尤其對于分布式系統(tǒng)來說更是。反規(guī)格化的數(shù)據(jù)模型允許我們以方便查詢的方式來存構造數(shù)據(jù)結構以簡化查詢復雜度。

適用性: Key-Value Store 鍵值對數(shù)據(jù)庫, Document Databases文檔數(shù)據(jù)庫, BigTable風格的數(shù)據(jù)庫。#p#

(2) 聚合 Aggregates

所有類型的NoSQL數(shù)據(jù)庫都會提供靈活的Schema(數(shù)據(jù)結構,對數(shù)據(jù)格式的限制):

  • Key-Value Stores 和 Graph Databases 基本上來說不會Value的形式,所以Value可以是任意格式。這樣一來,這使得我們可以任意組合一個業(yè)務實體的keys。比如,我們有一個用戶帳號的業(yè)務實體,其可以被如下這些key組合起來: UserID_name, UserID_email, UserID_messages 等等。如果一個用戶沒有email或message,那么相應也不會有這樣的記錄。
  • BigTable 模型通過列集合來支持靈活的Schema,我們稱之為列族(column family)。BigTable還可以在同一記錄上出現(xiàn)不同的版本(通過時間戳)。
  • Document databases 文檔數(shù)據(jù)庫是一種層級式的“去Schema”的存儲,雖然有些這樣的數(shù)據(jù)庫允許檢驗需要保存的數(shù)據(jù)是否滿足某種Schema。

靈活的Schema允許你可以用一種嵌套式的內部數(shù)據(jù)方式來存儲一組有關聯(lián)的業(yè)務實體(陳皓注:類似于JSON這樣的數(shù)據(jù)封裝格式)。這樣可以為我們帶來兩個好處。

  • 最小化“一對多”關系——可以通過嵌套式的方式來存儲實體,這樣可以少一些表聯(lián)結。
  • 可以讓內部技術上的數(shù)據(jù)存儲更接近于業(yè)務實體,特別是那種混合式的業(yè)務實體。可能存于一個文檔集或是一張表中。
下圖示意了這兩種好處。圖中描給了電子商務中的商品模型(陳皓注:我記得我在“挑戰(zhàn)無處不在”一文中說到過電商中產(chǎn)品分類數(shù)據(jù)庫設計的挑戰(zhàn))
  • 首先,所有的商品Product都會有一個ID,Price 和 Description。
  • 然后,我們可以知道不同的類型的商品會有不同的屬性。比如,作者是書的屬性,長度是牛仔褲的屬性。其些屬性可能是“一對多”或是“多對多”的關系,如:唱片中的曲目。
  • 接下來,我們知道,某些業(yè)務實體不可能使用固定的類型。如:牛仔褲的屬性并不是所有的牌子都有的,而且,有些名牌還會搞非常特別的屬性。

對于關系型數(shù)據(jù)庫來說,要設計這樣的數(shù)據(jù)模型并不簡單,而且設計出來的絕對離優(yōu)雅很遠很遠。而我們NoSQL中靈活的Schema允許你使用一個聚合 Aggregate (product) 可以建出所有不同種類的商品和他們的不同的屬性:

Entity Aggregation

上圖中我們可以比較關系型數(shù)據(jù)庫和NoSQL的差別。但是我們可以看到在數(shù)據(jù)更新上,非規(guī)格化的數(shù)據(jù)存儲在性能和一致性上會有很大的影響,這就是我們需要重點注意和不得不犧牲的地方。

適用性: Key-Value Store 鍵值對數(shù)據(jù)庫, Document Databases文檔數(shù)據(jù)庫, BigTable風格的數(shù)據(jù)庫。#p#

(3) 應用層聯(lián)結 Application Side Joins

表聯(lián)結基本上不被NoSQL支持。正如我們前面所說的,NoSQL是“面向問題”而不是“面向答案”的,不支持表聯(lián)結就是“面向問題”的后果。表的聯(lián)結是在設計時被構造出來的,而不是在執(zhí)行時建造出來的。所以,表聯(lián)結在運行時是有很大開銷的(陳皓注:搞過SQL表聯(lián)結的都知道笛卡爾積是什么東西,大可以在參看以前酷殼的“圖解數(shù)據(jù)庫表Joins”),但是在使用了 Denormalization 和 Aggregates 技術后,我們基本不用進行表聯(lián)結,如:你們使用嵌套式的數(shù)據(jù)實體。當然,如果你需要聯(lián)結數(shù)據(jù),你需要在應用層完成這個事。下面是幾個主要的Use Case:

  • 多對多的數(shù)據(jù)實體關系——經(jīng)常需要被連接或聯(lián)結。
  • 聚合 Aggregates 并不適用于數(shù)據(jù)字段經(jīng)常被改變的情況。對此,我們需要把那些經(jīng)常被改變的字段分到另外的表中,而在查詢時我們需要聯(lián)結數(shù)據(jù)。例如,我們有個Message系統(tǒng)可以有一個User實體,其包括了一個內嵌的Message實體。但是,如果用戶不斷在附加 message,那么,***把message拆分到另一個獨立的實體,但在查詢時聯(lián)結這User和Message這兩個實體。如下圖:

適用性: Key-Value Store 鍵值對數(shù)據(jù)庫, Document Databases文檔數(shù)據(jù)庫, BigTable風格的數(shù)據(jù)庫, Graph Databases 圖數(shù)據(jù)庫。

通用建模技術 General Modeling Techniques

在本書中,我們將討論NoSQL中各種不同的通用的數(shù)據(jù)建模技術。#p#

(4) 原子聚合 Atomic Aggregates

很多NoSQL的數(shù)據(jù)庫(并不是所有)在事務處理上都是短板。在某些情況下,他們可以通過分布式鎖技術或是應用層管理的MVCC技術來實現(xiàn)其事務性(陳皓注:可參看本站的“多版本并發(fā)控制(MVCC)在分布式系統(tǒng)中的應用”)但是,通常來說只能使用聚合Aggregates技術來保證一些ACID原則。

這就是為什么我們的關系型數(shù)據(jù)庫需要有強大的事務處理機制——因為關系型數(shù)據(jù)庫的數(shù)據(jù)是被規(guī)格化存放在了不同的地方。所以,Aggregates聚合允許我們把一個業(yè)務實體存成一個文檔、存成一行,存成一個key-value,這樣就可以原子式的更新了:


Atomic Aggregates

當然,原子聚合 Atomic Aggregates 這種數(shù)據(jù)模型并不能實現(xiàn)完全意義上的事務處理,但是如果支持原子性,鎖,或 test-and-set 指令,那么, Atomic Aggregates 是可以適用的。

適用性: Key-Value Store 鍵值對數(shù)據(jù)庫, Document Databases文檔數(shù)據(jù)庫, BigTable風格的數(shù)據(jù)庫。

(5) 可枚舉鍵 Enumerable Keys

也許,對于無順序的Key-Value***的好處是業(yè)務實體可以被容易地hash以分區(qū)在多個服務器上。而排序了的key會把事情搞復雜,但是有些時候,一個應用能從排序key中獲得很多好處,就算是數(shù)據(jù)庫本身不提供這個功能。讓我們來思考下email消息的數(shù)據(jù)模型:

  1. 一些NoSQL的數(shù)據(jù)庫提供原子計數(shù)器以允許生一些連續(xù)的ID。在這種情況下,我們可以使用 userID_messageID 來做為一個組合key。如果我們知道***的message ID,就可以知道前一個message,也可能知道再前面和后面的Message。
  2. Messages可以被打包。比如,每天的郵件包。這樣,我們就可以對郵件按指定的時間段來遍歷。

適用性: Key-Value Store 鍵值對數(shù)據(jù)庫。#p#

(6) 降維 Dimensionality Reduction

Dimensionality Reduction 降維是一種技術可以允許把一個多維的數(shù)據(jù)映射成一個Key-Value或是其它非多給的數(shù)據(jù)模型。

傳統(tǒng)的地理位置信息系統(tǒng)使用一些如“四分樹QuadTree” 或 “R-Tree” 來做地理位置索引。這些數(shù)據(jù)結構的內容需要被在適當?shù)奈恢酶拢⑶遥绻麛?shù)據(jù)量很大的話,操作成本會很高。另一個方法是我們可以遍歷一個二維的數(shù)據(jù)結構并把其扁平化成一個列表。一個眾所周知的例子是Geohash(地理哈希)。一個Geohash使用“之字形”的路線掃描一個2維的空間,而且遍歷中的移動可以被簡單地用0和1來表示其方向,然后在移動的過程中產(chǎn)生0/1串。下圖展示了這一算法:(陳皓注:先把地圖分成四份,經(jīng)度為***位,緯度為第二位,于是左邊的經(jīng)度是0,右邊的是1,緯度也一樣,上面是為1,下面的為0,這樣,經(jīng)緯度就可以組合成01,11,00,10這四個值,其標識了四塊區(qū)域,我們可以如此不斷的遞歸地對每個區(qū)域進行四分,然后可以得到一串1和0組成的字串,然后使用0-9,b-z 去掉(去掉a, i, l, o)這32個字母進行base32編碼得到一個8個長度的編碼,這就是Geohash的算法)


Geohash Index

Geohash的***大的功能是使用簡單的位操作就可以知道兩個區(qū)域間的距離,就像圖中所示(陳皓:proximity框著的那兩個,這個很像IP地址了)。Geohash把一個二維的坐標生生地變成了一個一維的數(shù)據(jù)模型,這就是降維技術。BigTable的降維技術參看到文章后面的 [6.1]。更多的關于Geohash和其它技術可以參看 [6.2] 和 [6.3]。

適用性: Key-Value Store 鍵值對數(shù)據(jù)庫, Document Databases文檔數(shù)據(jù)庫, BigTable風格的數(shù)據(jù)庫。#p#

(7) 索引表 Index Table

Index Table 索引表是一個非常直白的技術,其可以你在不支持索引的數(shù)據(jù)庫中得到索引的好處。BigTable是這類最重要的數(shù)據(jù)庫。這需要我們維護一個有相應存取模式的特別表。例如,我們有一個主表存著用戶帳號,其可以被UserID存取。某查詢需要查出某個城市里所有的用戶,于是我們可以加入一張表,這張表用城市做主鍵,所有和這個城市相關的UserID是其Value,如下所示:


Index Table Example

可見,城市索引表的需要和對主表用戶表保持一致性,因此,主表的每一個更新可能需要對索引表進行更新,不然就是一個批處理更新。無論哪個方式,這都會損傷一些性能,因為需要保持一致性。

Index Table 索引表可以被認為是關系型數(shù)據(jù)庫中的視圖的等價物。

適用性: BigTable 數(shù)據(jù)庫。

(8) 鍵組合索引 Composite Key Index

Composite key 鍵組合是一個很常用的技術,對此,當我們的數(shù)據(jù)庫支持鍵排序時能得到極大的好處。Composite key組合鍵的拼接成為第二排序字段可以讓你構建出一種多維索引,這很像我們之前說過的 Dimensionality Reduction 降維技術。例如,我們需要存取用戶統(tǒng)計。如果我們需要根據(jù)不同的地區(qū)來統(tǒng)計用戶的分布情況,我們可以把Key設計成這樣的格式 (State:City:UserID),這樣一來,就使得我們可以通過State到City來按組遍歷用戶,特別是我們的NoSQL數(shù)據(jù)庫支持在key上按區(qū)查詢(如:BigTable類的系統(tǒng)):

1
2
SELECT Values WHERE state="CA:*"
SELECT Values WHERE city="CA:San Francisco*"

Composite Key Index

 

適用性: BigTable 數(shù)據(jù)庫。#p#

(9) 鍵組合聚合 Aggregation with Composite Keys

Composite keys  鍵組合技術并不僅僅可以用來做索引,同樣可以用來區(qū)分不用的類型的數(shù)據(jù)以支持數(shù)據(jù)分組。考慮一個例子,我們有一個海量的日志數(shù)組,這個日志記錄了互聯(lián)網(wǎng)上的用戶的訪問來源。我們需要計算從某一網(wǎng)站過來的獨立訪客的數(shù)量,在關系型數(shù)據(jù)庫中,我們可能需要下面這樣的SQL查詢語句:

1
SELECT count(distinct(user_id)) FROM clicks GROUP BY site

我們可以在NoSQL中建立如下的數(shù)據(jù)模型:


Counting Unique Users using Composite Keys

 

這樣,我們就可以把數(shù)據(jù)按UserID來排序,我們就可以很容易把同一個用戶的數(shù)據(jù)(一個用戶并不會產(chǎn)生太多的event)進行處理,去掉那些重復的站點(使用hash table或是別的什么)。另一個可選的技術是,我們可以對每一個用戶建立一個數(shù)據(jù)實體,然后把其站點來源追加到這個數(shù)據(jù)實體中,當然,這樣一來,數(shù)據(jù)的更新在性能相比之下會有一定損失。

適用性: Ordered Key-Value Store 排序鍵值對數(shù)據(jù)庫, BigTable風格的數(shù)據(jù)庫。

 

(10) 反轉搜索 Inverted Search – 直接聚合 Direct Aggregation

這個技術更多的是數(shù)據(jù)處理技術,而不是數(shù)據(jù)建模技術。盡管如此,這個技術還是會影響數(shù)據(jù)模型。這個技術最主要的想法是使用一個索引來找到滿足某條件的數(shù)據(jù),但是把數(shù)據(jù)聚合起需要使用全文搜索。還是讓我們來說一個示例。還是用上面那個例子,我們有很多的日志,其中包括互聯(lián)網(wǎng)用戶和他們的訪問來源。讓我們假定每條記錄都有一個UserID,還有用戶的種類 (Men, Women, Bloggers, 等),以及用戶所在的城市,和訪問過的站點。我們要干的事是,為每個用戶種類找到滿足某些條件(訪問源,所在城市,等)的的獨立用戶。

很明顯,我們需要搜索那些滿足條件的用戶,如果我們使用反轉搜索,這會讓我們把這事干得很容易,如: {Category -> [user IDs]} 或 {Site -> [user IDs]}。使用這樣的索引, 我們可以取兩個或多個UserID要的交集或并集(這個事很容易干,而且可以干得很快,如果這些UserID是排好序的)。但是,我們要按用戶種類來生成報表會變得有點麻煩,因為我們用語句可能會像下面這樣

1
SELECT count(distinct(user_id)) ... GROUP BY category
 
 

但這樣的SQL很沒有效率,因為category數(shù)據(jù)太多了。為了應對這個問題,我們可以建立一個直接索引 {UserID -> [Categories]} 然后我們用它來生成報表:


Counting Unique Users using Inverse and Direct Indexes

 

***,我們需要明白,對每個UserID的隨機查詢是很沒有效率的。我們可以通過批查詢處理來解決這個問題。這意味著,對于一些用戶集,我們可以進行預處理(不同的查詢條件)。

適用性: Key-Value Store 鍵值對數(shù)據(jù)庫, Document Databases文檔數(shù)據(jù)庫, BigTable風格的數(shù)據(jù)庫。#p#

層級式模型 Hierarchy Modeling Techniques

(11) 樹形聚合Tree Aggregation

樹形或是任意的圖(需反規(guī)格化)可以被直接打成一條記錄或文檔存放。

  • 當樹形結構被一次性取出時這會非常有效率(如:我們需要展示一個blog的樹形評論)
  • 搜索和任何存取這個實體都會存在問題。
  • 對于大多數(shù)NoSQL的實現(xiàn)來說,更新數(shù)據(jù)都是很不經(jīng)濟的(相比起獨立結點來說)


Tree Aggregation

 

適用性: Key-Value 鍵值對數(shù)據(jù)庫, Document Databases 文檔數(shù)據(jù)庫

(12) 鄰接列表 Adjacency Lists

Adjacency Lists 鄰接列表是一種圖 – 每一個結點都是一個獨立的記錄,其包含了 所有的父結點或子結點。這樣,我們就可以通過給定的父或子結點來進行搜索。當然,我們需要通過hop查詢遍歷圖。這個技術在廣度和深度查詢,以及得到某個結點的子樹上沒有效率。

適用性: Key-Value 鍵值對數(shù)據(jù)庫, Document Databases 文檔數(shù)據(jù)庫#p#

 

(13) Materialized Paths

Materialized Paths 可以幫助避免遞歸遍歷(如:樹形結構)。這個技術也可以被認為是反規(guī)格化的一種變種。其想法是為每個結點加上父結點或子結點的標識屬性,這樣就可以不需要遍歷就知道所有的后裔結點和祖先結點了:


Materialized Paths for eShop Category Hierarchy

這個技術對于全文搜索引擎來說非常有幫助,因為其可以允許把一個層級結構轉成一個文檔。上面的示圖中我們可以看到所有的商品或Men’s Shoes下的子分類可以被一條很短的查詢語句處理——只需要給定個分類名。

Materialized Paths 可以存儲一個ID的集合,或是一堆ID拼出的字符串。后者允許你通過一個正則表達式來搜索一個特定的分支路徑。下圖展示了這個技術(分支的路徑包括了結點本身):


Query Materialized Paths using RegExp

 

適用性: Key-Value 鍵值對數(shù)據(jù)庫, Document Databases 文檔數(shù)據(jù), Search Engines 搜索引擎

(14) 嵌套集 Nested Sets

Nested sets 嵌套集是樹形結構的標準技術。它被廣泛地用在了關系性數(shù)據(jù)庫中,它完全地適用于 Key-Value 鍵值對數(shù)據(jù)庫 和 Document Databases 文檔數(shù)據(jù)庫。這個技術的想法是把葉子結點存儲成一個數(shù)組,并通過使用索引的開始和結束來映射每一個非葉子結點到一個葉子結點集,就如下圖所示一樣:


Modeling of eCommerce Catalog using Nested Sets

這樣的數(shù)據(jù)結構對于immutable data不變的數(shù)據(jù) 有非常不錯的效率,因為其點內存空間小,并且可以很快地找出所有的葉子結點而不需要樹的遍歷。盡管如此,在插入和更新上需要很高的性能成本,因為新的葉子結點需要大規(guī)模地更新索引。

適用性: Key-Value Stores 鍵值數(shù)據(jù)庫, Document Databases 文檔數(shù)據(jù)庫#p#

(15) 嵌套文檔扁平化:有限的字段名 Nested Documents Flattening: Numbered Field Names

搜索引擎基本上來說和扁平文檔一同工作,如:每一個文檔是一個扁平的字段和值的例表。這種數(shù)據(jù)模型的用來把業(yè)務實體映射到一個文本文檔上,如果你的業(yè)務實體有很復雜的內部結構,這可能會變得很有挑戰(zhàn)。一個典型的挑戰(zhàn)是把一個有層級的文檔映映射出來。例如,文檔中嵌套另一個文檔。讓我們看看下面的示例:


Nested Documents Problem

 

上面的每一個業(yè)務實體代碼一種簡歷。其包括了人名和一個技能列表。我把這個層級文檔映射成一個文本文檔,一種方法是創(chuàng)建 Skill 和 Level 字段。這個模型可以通過技術或是等級來搜索一個人,而上圖標注的那樣的組合查詢則會失敗。(陳皓注:因為分不清Excellent是否是Math還是Poetry上的)

在引用中的 [4.6] 給出了一種解決方案。其為每個字段都標上數(shù)字 Skill_i 和 Level_i,這樣就可以分開搜索每一個對(下圖中使用了OR來遍歷查找所有可能的字段):


Nested Document Modeling using Numbered Field Names

 

這樣的方式根本沒有擴展性,對于一些復雜的問題來說只會讓代碼復雜度和維護工作變大。

適用性: Search Engines 全文搜索#p#

(16)嵌套文檔扁平化:鄰近查詢 Nested Documents Flattening: Proximity Queries

在附錄 [4.6]中給出了這個技術用來解決扁平層次文檔。它用鄰近的查詢來限制可被查詢的單詞的范圍。下圖中,所有的技能和等級被放在一個字段中,叫 SkillAndLevel,查詢中出現(xiàn)的 “Excellent” 和 “Poetry” 必需一個緊跟另一個:


Nested Document Modeling using Proximity Queries

 

附錄 [4.3] 中講述了這個技術被用在Solr中的一個成功案例。

適用性: Search Engines 全文搜索

(17) 圖結構批處理 Batch Graph Processing

Graph databases 圖數(shù)據(jù)庫,如 neo4j 是一個出眾的圖數(shù)據(jù)庫,尤其是使用一個結點來探索鄰居結點,或是探索兩個或少量結點前的關系。但是處理大量的圖數(shù)據(jù)是很沒有效率的,因為圖數(shù)據(jù)庫的性能和擴展性并不是其目的。分布式的圖數(shù)據(jù)處理可以被 MapReduce 和 Message Passing pattern 來處理。如: 在我前一篇的文章中的那個示例。這個方法可以讓 Key-Value stores, Document databases, 和 BigTable-style databases 適合于處理大圖。

Applicability: Key-Value Stores, Document Databases, BigTable-style Databases

責任編輯:趙寧寧
相關推薦

2012-05-15 10:28:29

NoSQL數(shù)據(jù)庫建模技術

2010-06-29 14:51:26

UML建模技術

2015-04-03 12:47:14

NoSQL開源非關系型數(shù)據(jù)庫

2013-05-03 00:41:57

大數(shù)據(jù)NoSQL

2023-11-09 08:00:00

NoSQL數(shù)據(jù)庫

2010-04-01 09:45:38

NoSQL

2010-06-30 16:52:23

UML數(shù)據(jù)建模

2010-03-16 14:05:19

Cassandra

2010-07-07 18:11:13

UML對象圖

2010-06-08 18:53:43

UML建模工具

2015-06-16 10:39:43

NoSQL分布式算法

2010-06-17 10:38:08

UML動態(tài)建模機制

2010-06-10 17:14:54

UML建模過程

2016-12-04 16:36:18

NoSQL數(shù)據(jù)庫大數(shù)據(jù)

2010-06-30 09:51:55

UML建模技術

2010-06-30 09:34:44

UML建模技術

2010-07-08 14:02:35

UML建模流程

2024-10-10 08:46:28

2010-06-12 11:22:57

UML應用

2014-01-06 10:44:17

Angular數(shù)據(jù)
點贊
收藏

51CTO技術棧公眾號

无码人妻av免费一区二区三区| 伊人影院在线观看视频| 9191在线| 国产成人av福利| 2019最新中文字幕| 免费91在线观看| 国产精品香蕉| 欧美日韩精品免费| 久久国产午夜精品理论片最新版本| 欧美一区二区三区少妇| 国内久久精品视频| 欧美怡红院视频一区二区三区| 99热这里只有精品4| 久久av国产紧身裤| 欧美麻豆精品久久久久久| av网站大全免费| 日韩毛片久久久| 91玉足脚交白嫩脚丫在线播放| 成人黄色av免费在线观看| www.国产com| 欧美黄在线观看| 国产一区二区三区免费视频| 亚洲中文字幕无码一区| 97精品资源在线观看| 日韩欧美有码在线| 日本五级黄色片| 欧洲日本在线| 国产亚洲制服色| 国产综合精品一区二区三区| av一区二区三| 久久精品99国产精品| 2019中文在线观看| 精品少妇一二三区| 一区二区电影在线观看| 国产亚洲综合久久| 免费看污黄网站在线观看| 91成人精品在线| 91精品国产综合久久小美女| 国产aaaaa毛片| 欧美黑人巨大xxxxx| 天天免费综合色| www.国产在线视频| 久草在线资源站资源站| 亚洲精品一二三四区| 婷婷视频在线播放| 黄色网址免费在线观看| 国产精品久久久久久妇女6080| 欧美在线一二三区| 国产乱视频在线观看| 久久精品亚洲国产奇米99| 久久综合九九| 免费人成在线观看网站| 99国产精品久| 欧美一区1区三区3区公司| 亚洲 国产 欧美 日韩| 波多野结衣在线一区| 国产精品一区二区免费| 日本wwwxxxx| 99久久精品99国产精品| 久久精品日韩| 精品美女视频在线观看免费软件| 91视频精品在这里| 欧美日韩一区在线观看视频| 九色视频网站在线观看| 国产精品视频你懂的| 亚洲一区在线直播| 超碰在线免费公开| 亚洲综合偷拍欧美一区色| 欧美午夜小视频| 依依综合在线| 欧美欧美午夜aⅴ在线观看| 福利片一区二区三区| 日韩精品三级| 亚洲国产精品电影| 国产成人精品无码免费看夜聊软件| 视频一区欧美| www日韩欧美| 久久97人妻无码一区二区三区| 亚洲茄子视频| 国产成人小视频在线观看| 一级aaaa毛片| 成人午夜免费av| 欧美日韩在线一二三| 最新97超碰在线| 亚洲精品成人少妇| 男人操女人逼免费视频| 成人在线免费| 精品久久人人做人人爽| 亚洲狠狠婷婷综合久久久久图片| 精品一区av| 欧美夫妻性生活xx| 免费看日批视频| 韩国午夜理伦三级不卡影院| 精品一区二区日本| 高清全集视频免费在线| 欧美午夜精品久久久久久久| www.污污视频| 亚洲人和日本人hd| 欧美日本在线视频中文字字幕| 国产精品视频免费播放| 国产一区二区在线电影| 久热这里只精品99re8久| 久操视频在线观看| 欧美性猛交xxxx乱大交3| 亚洲一二三不卡| 亚洲人成伊人成综合图片| 久久99精品久久久久久琪琪| 国产黄色免费视频| av网站免费线看精品| 在线日韩av永久免费观看| 日韩脚交footjobhd| 91精品国产91久久综合桃花| 免费看91的网站| 亚洲韩日在线| 91在线播放视频| 成人动漫在线免费观看| 同产精品九九九| 人妻少妇偷人精品久久久任期| 国产videos久久| 性色av一区二区三区| a级片免费观看| 国产精品久久国产精麻豆99网站| 日韩欧美精品在线观看视频| 77成人影视| 欧美精品性视频| 一级黄在线观看| 国产欧美日韩卡一| 麻豆av免费在线| 欧美巨大xxxx| 久久免费少妇高潮久久精品99| 国产毛片久久久久| 国产精品欧美一级免费| 亚洲国产精品三区| 九九亚洲视频| 人人澡人人澡人人看欧美| 日本成人动漫在线观看| 亚洲一区影音先锋| 免费观看黄网站| 成人网18免费网站| 国产免费一区二区三区香蕉精| 欧美高清成人| 色综合久久88色综合天天6 | 亚洲二区三区四区| 久久野战av| 亚洲少妇激情视频| 中文字幕手机在线视频| 久久久不卡影院| 国产成人综合一区| 国产成人精品三级高清久久91| 奇门遁甲1982国语版免费观看高清| 天天综合网在线| 图片区小说区区亚洲影院| 久久人人妻人人人人妻性色av| 亚洲精品婷婷| 久久亚洲免费| 婷婷午夜社区一区| 在线a欧美视频| 亚洲图片欧美在线| 亚洲人xxxx| 亚洲综合中文网| 激情婷婷欧美| 欧美精品中文字幕一区二区| 婷婷综合六月| 日韩在线观看你懂的| 国产精品无码专区av免费播放| 综合激情成人伊人| 日韩高清一二三区| 亚洲一区二区三区免费在线观看 | 清纯唯美综合亚洲| 91欧美精品午夜性色福利在线| 在线xxxx| 日韩电影免费观看中文字幕| 夜夜爽妓女8888视频免费观看| 国产精品卡一卡二卡三| 亚洲丝袜在线观看| 一本一道久久综合狠狠老精东影业| 欧美高清一区二区| av成人在线网站| 韩国福利视频一区| 国产小视频免费在线网址| 欧美情侣在线播放| 在线观看 中文字幕| 欧美国产乱子伦| 国产精品嫩草69影院| 久久xxxx精品视频| 免费国产成人看片在线| 美女一区2区| 国产欧美一区二区白浆黑人| 人交獸av完整版在线观看| 亚洲欧美激情视频| 精品国产无码一区二区三区| 欧美日韩亚洲一区二区三区| 日本美女黄色一级片| 成人免费看视频| 熟妇人妻无乱码中文字幕真矢织江| 永久91嫩草亚洲精品人人| 久久综合狠狠综合久久综青草| 爱情电影网av一区二区| 国产91免费看片| 日韩成人伦理| 日韩中文字幕免费看| 五月婷婷开心中文字幕| 欧美福利视频一区| av毛片在线免费观看| 亚洲自拍偷拍欧美| 任我爽在线视频| 久久九九全国免费| v天堂中文在线| 国精品**一区二区三区在线蜜桃| 日韩黄色片视频| 欧美午夜a级限制福利片| 日韩欧美手机在线| 久久亚州av| 成人午夜黄色影院| 欧亚一区二区| 青草青草久热精品视频在线观看| 欧美bbbxxxxx| 久久天天躁狠狠躁夜夜爽蜜月| 国产视频网址在线| 国产丝袜一区二区| 无码国产精品一区二区免费16| 欧美一区二区视频在线观看2022| 自拍偷拍第八页| 色噜噜狠狠色综合欧洲selulu| 日本在线视频免费| 亚洲自拍偷拍图区| 2021亚洲天堂| 亚洲婷婷在线视频| av资源在线免费观看| 久久九九久久九九| 中文字幕一区二区三区人妻| 成人午夜又粗又硬又大| 少妇献身老头系列| 国产精品99久| 中文 日韩 欧美| 精品在线一区二区三区| 羞羞的视频在线| 精品在线亚洲视频| av在线网址导航| 蜜桃视频免费观看一区| 午夜免费一区二区| 蜜臀久久99精品久久久久久9| 91网址在线播放| 蜜桃av一区二区三区电影| 亚洲精品高清无码视频| 日韩二区三区四区| 国产三级三级三级看三级| 每日更新成人在线视频| 99精品视频播放| 久热精品在线| 亚洲无吗一区二区三区| 麻豆久久久久久| 中文字幕在线视频精品| 国模无码大尺度一区二区三区| 香蕉视频色在线观看| 国产麻豆成人传媒免费观看| 日本少妇激三级做爰在线| 国产精品香蕉一区二区三区| 中文字幕人妻熟女在线| 99精品一区二区| 蜜桃精品一区二区| 97久久精品人人爽人人爽蜜臀| 亚洲国产第一区| 久久久精品综合| 亚洲毛片亚洲毛片亚洲毛片| 国产精品久久久久久久午夜片| 亚洲不卡在线播放| 亚洲中国最大av网站| 国产精品第9页| 在线观看亚洲精品视频| 国产免费久久久| 精品粉嫩超白一线天av| 欧美人体大胆444www| 少妇精69xxtheporn| 伦理在线一区| 日韩美女视频在线观看| 日韩黄色碟片| 国产高清在线一区二区| 伊人春色精品| 欧美性受黑人性爽| 欧美亚洲一区| 久久久久久久久久久久久久久国产| 国产不卡高清在线观看视频| v8888av| 国产精品欧美极品| 久久久久成人精品无码| 在线视频国产一区| 国产不卡精品视频| 亚洲性视频网站| 在线观看的网站你懂的| 国产精品av电影| 999久久精品| 相泽南亚洲一区二区在线播放| 牛夜精品久久久久久久99黑人| 欧美a在线视频| 国产一区二区三区蝌蚪| 在线免费观看成年人视频| 亚洲日本中文字幕区| 狠狠人妻久久久久久综合| 日韩一区二区免费电影| 国产女人在线观看| 91国产视频在线| 精品国产伦一区二区三区观看说明 | 日韩视频 中文字幕| 日韩在线观看一区二区| 波多野结衣三级视频| 国产精品美日韩| 亚洲国产成人无码av在线| 日韩一区二区三区电影在线观看 | 色老板在线视频一区二区| 中文字幕久精品免| 天堂在线一区二区| 黄色在线免费播放| 亚洲精品视频自拍| 中文字幕 视频一区| 日韩国产在线播放| 成人性生交大片免费看网站| 成人妇女免费播放久久久| 精品国产aⅴ| 苍井空浴缸大战猛男120分钟| 成人亚洲一区二区一| 青青草手机在线视频| 91精品欧美综合在线观看最新 | 国产成人一二| 欧美一级黄色录像片| 九九精品视频在线看| 欧美日韩国产黄色| 色综合久久天天综合网| 四虎精品成人免费网站| 韩日精品中文字幕| 成人h动漫免费观看网站| 免费cad大片在线观看| 黄色日韩网站视频| 小向美奈子av| 欧美三级日本三级少妇99| 国产二区在线播放| 国产精品福利片| 国产麻豆一区二区三区精品视频| 国产精品专区在线| 国产+成+人+亚洲欧洲自线| 九九热精品在线观看| 日韩一二三区不卡| av免费在线观看网站| 成人动漫视频在线观看免费| 欧美精品国产一区二区| 午夜性福利视频| 性做久久久久久久久| 亚洲欧洲精品视频| 欧美亚洲另类激情另类| 亚洲欧美日本伦理| 99草草国产熟女视频在线| 久久嫩草精品久久久久| 最近中文在线观看| www.国产精品一二区| 精品视频在线观看免费观看 | 国产成人一区二区在线观看| 日本乱人伦aⅴ精品| av在线免费观看网| 亚洲一区二区日本| 黄色欧美日韩| 中文字幕5566| 欧美少妇bbb| 高h视频在线观看| 精品日韩欧美| 天堂精品中文字幕在线| 在线视频这里只有精品| 日韩一区二区三区在线| 91色在线看| 日韩免费av电影| 国产一区二区三区香蕉| www.av视频在线观看| 亚洲人成在线观看| 亚洲欧美综合久久久久久v动漫| 国产av熟女一区二区三区| 99精品黄色片免费大全| 综合久久中文字幕| 欧美激情第6页| 国产在线日韩精品| 日本中文字幕有码| 在线这里只有精品| 99视频免费在线观看| 精品毛片久久久久久| 麻豆精品一区二区av白丝在线| 精品亚洲永久免费| 国产亚洲一区二区精品| 久久久久毛片免费观看| 日本久久久精品视频| 中文字幕一区二区三中文字幕| 欧美 日韩 国产 成人 在线 91| 日韩av观看网址| 你懂的一区二区| 色欲AV无码精品一区二区久久 | 午夜福利三级理论电影| 在线一区二区三区四区| www在线视频| 欧美黑人3p| 国产成人99久久亚洲综合精品| 无码视频在线观看| 欧美激情伊人电影| 成人羞羞网站|