NoSQL 數據建模技術

發表于:2012-05-18來源:不祥作者:陳皓點擊數: 標簽:數據庫
全文譯自墻外文章NoSQL Data Modeling Techniques,譯得不好,還請見諒。這篇文章看完之后,你可能會對NoSQL的數據結構會有些感覺。我的感覺是,關系型數據庫想把一致性,完整性,索引,CRUD都干好,NoSQL只干某一種事,但是犧牲了很多別的東西??傮w來說,

  全文譯自墻外文章“NoSQL Data Modeling Techniques”,譯得不好,還請見諒。這篇文章看完之后,你可能會對NoSQL的數據結構會有些感覺。我的感覺是,關系型數據庫想把一致性,完整性,索引,CRUD都干好,NoSQL只干某一種事,但是犧牲了很多別的東西??傮w來說,我覺得NoSQL更適合做Cache。下面是正文——

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

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

  NoSQL Data Models

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

  最終用戶一般更感興趣于數據的聚合顯示,而不是分離的數據,這主要通過SQL來完成。

  我們無法通過人手工控制數據的并發性,完整性,一致性,或是數據類型校驗這些東西的。這就是為什么SQL需要在事務,二維表結構(schema)和外表聯合上做很多事。

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

  Key-Value 鍵值對存儲是非常簡單而強大的。下面的很多技術基本上都是基于這個技術開始發展的。但是,Key-Value有一個非常致命的問題,那就是如果我們需要查找一段范圍內的key。(陳皓注:學過hash-table數據結構的人都應該知道,hash-table是非序列容器,其并不像數組,鏈接,隊列這些有序容器,我們可以控制數據存儲的順序)。于是,有序鍵值 (Ordered Key-Value) 數據模型被設計出來解決這一限制,來從根本上提高數據集的問題。

  Ordered Key-Value 有序鍵值模型也非常強大,但是,其也沒有對Value提供某種數據模型。通常來說,Value的模型可以由應用負責解析和存取。這種很不方便,于是出現了 BigTable類型的數據庫,這個數據模型其實就是map里有map,map里再套map,一層一層套下去,也就是層層嵌套的key-value(value里又是一個key-value),這種數據庫的Value主要通過“列族”(column families),列,和時間戳來控制版本。(陳皓注:關于時間戳來對數據的版本控制主要是解決數據存儲并發問題,也就是所謂的樂觀鎖,詳見《多版本并發控制(MVCC)在分布式系統中的應用》)

  Document databases 文檔數據庫 改進了 BigTable 模型,并提供了兩個有意義的改善。第一個是允許Value中有主觀的模式(scheme),而不是map套map。第二個是索引。 Full Text Search Engines 全文搜索引擎可以被看作是文檔數據庫的一個變種,他們可以提供靈活的可變的數據模式(scheme)以及自動索引。他們之間的不同點主要是,文檔數據庫用字段名做索引,而全文搜索引擎用字段值做索引。

  Graph data models 圖式數據庫 可以被認為是這個進化過程中從 Ordered Key-Value 數據庫發展過來的一個分支。圖式數據庫允許構建議圖結構的數據模型。它和文檔數據庫有關系的原因是,它的很多實現允許value可以是一個map或是一個document。

  NoSQL 數據模型摘要

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

  NoSQL 數據模型設計一般從業務應用的具體數據查詢入手,而不是數據間的關系:

  關系型的數據模型基本上是分析數據間的結構和關系。其設計理念是: ”What answers do I have?”

  NoSQL 數據模型基本上是從應用對數據的存取方式入手,如:我需要支持某種數據查詢。其設計理念是 ”What questions do I have?”

  NoSQL 數據模型設計比關系型數據庫需要對數據結構和算法的更深的了解。在這篇文章中我會和大家說那些盡人皆知的數據結構,這些數據結構并不只是被NoSQL使用,但是對于NoSQL的數據模型卻非常有幫助。

  數據冗余和反規格化是一等公民。

  關系型數據庫對于處理層級數據和圖式數據非常的不方便。NoSQL用來解決圖式數據明顯是一個非常好的解決方案,幾乎所有的NoSQL數據庫可以很強地解決此類問題。這就是為什么這篇文章專門拿出一章來說明層級數據模型。

  下面是NoSQL的分類表,也是我用來寫這篇文章時做實踐的產品:

  Key-Value 存儲: Oracle Coherence, Redis, Kyoto Cabinet

  類BigTable存儲: Apache HBase, Apache Cassandra

  文檔數據庫: MongoDB, CouchDB

  全文索引: Apache Lucene, Apache Solr

  圖數據庫: neo4j, FlockDB

  概念技術 Conceptual Techniques

  這一節主要介紹NoSQL數據模型的基本原則。

  (1) 反規格化 Denormalization

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

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97