以下是copy的:
數據模型概述
1.關系模型
關系模型使用記錄(由元組組成)進行存儲,記錄存儲在由模式定義的表中。表中的每壹列都有壹個名稱和類型,表中的所有記錄都必須符合表的定義。SQL是壹種特殊的查詢語言,它提供了相應的語法來查找符合條件的記錄,比如表連接。表連接可以根據表之間的關系查詢多個表之間的記錄。
可以創建和刪除表中的記錄,並且可以單獨更新記錄中的字段。
關系模型數據庫通常提供事務處理機制,為涉及多條記錄的自動處理提供解決方案。
對於不同的編程語言,表可以看作數組、記錄列表或結構。可以使用B樹和哈希表對表進行索引,以應對高性能訪問。
2.鍵值存儲
鍵值存儲提供基於鍵的值訪問。
可以創建或刪除鍵-值對,並且可以更新與鍵相關聯的值。
鍵值存儲通常不提供事務機制。
對於不同的編程語言,鍵值存儲類似於哈希表。不同的編程語言有不同的名稱(比如Java稱之為“HashMap”,Perl稱之為“hash”,Python稱之為“dict”,PHP稱之為“associative array”),而C++稱之為“boost:: unordered _ map”
鍵值存儲支持對鍵的隱式索引。
鍵值存儲可能看起來用處不大,但是可以存儲很多關於“值”的信息。值可以是XML文檔、JSON對象或任何其他序列化形式。
重要的是,鍵值存儲引擎並不關心“值”的內部結構,它依賴於客戶端來解釋和管理“值”。
3.文檔存儲
文檔存儲支持對結構化數據的訪問。與關系模型不同,文檔存儲沒有強制性的體系結構。
事實上,文檔存儲是以包鍵值對的形式存儲的。在這種情況下,應用程序對要檢索的數據包采用壹些約定,或者使用存儲引擎的能力將不同的文檔分成不同的集合來管理數據。
與關系模型不同,文檔存儲模型支持嵌套結構。例如,文檔存儲模型支持XML和JSON文檔,可以嵌套壹個字段的“值”來存儲其他文檔。文檔存儲模型還支持數組和列值鍵。
與鍵值存儲不同,文檔存儲關註的是文檔的內部結構。這使得存儲引擎能夠直接支持二級索引,從而允許高效地查詢任何字段。支持文檔嵌套存儲的能力使得查詢語言具有搜索嵌套對象的能力。XQuery就是壹個例子。MongoDB通過支持在查詢中指定JSON字段路徑來實現類似的功能。
4.列存儲
如果翻轉數據,列存儲和關系存儲會非常相似。與關系模型存儲記錄不同,列存儲以流的方式將所有數據存儲在列中。對於任何記錄,索引都可以快速獲取該列上的數據。
Map-reduce的實現Hadoop的流數據處理效率很高,列存儲的優勢體現到了極致。因此,HBase和Hypertable通常作為非關系型數據倉庫來支持Map-reduce的數據分析。
關系類型的列標簽對於數據分析來說是無效的,所以用戶經常在列數據庫中存儲更復雜的數據。這直接體現在Cassandra中,它引入的“柱族”可以認為是壹個“超級柱”。
列存儲支持行檢索,但這需要從每列獲取匹配的列值並重新組織行。
5.圖形數據庫
圖形數據庫存儲頂點和邊的信息,有些支持添加註釋。
圖形數據庫可以用來對事物建模,比如社交地圖和現實世界中的各種對象。IMDB(互聯網電影數據庫)網站的內容構成了壹個復雜的圖像,演員和電影相互交織。
圖形數據庫的查詢語言壹般用於查找圖形斷點的路徑或端點間路徑的屬性。Secondary是壹個典型的圖形數據庫。
妳選擇哪種數據模型?
數據模型各有優缺點,適用於不同的領域。無論選擇關系模型還是非關系模型,都要根據實際的應用場景進行選擇。也許妳會發現單壹的數據模型並不能滿足妳的解決方案,很多大型應用可能需要集成多個數據模型。