創建紀錄
- 唯一主鍵在關係型和非關係型數據庫中都很重要。
- MongoDB中沒有數據庫join的概念,因此要麼在客戶端利用對象標識符手工實現join操作,要麼利用DBRef。
- 面向列數據庫沒有定義任何關係引用的概念。因爲它也避免了集合之間的連接。列數據庫裏數據是這樣存儲的:每個行健唯一標識一條記錄,一個列族的所有列存儲在一起。面向列的數據庫,特別是HBase,也有一個保存數據的時間維度,這樣創建(插入)操作很重要,而沒有更新操作。
HBase是數據的結構扁平化,只有列族和他包含的列之間纔有層次關係。此外,他還按照時間維度存儲每個單元格的數據,所以講數據存儲入HBase前,需要對嵌套的數據進行扁平化處理。
- Redis爲代表的鍵值對映射表是一種簡單強大的數據結構服務器,支持以簡單的鍵值對或者集合元素的形式來存儲數據。每個鍵值對可以是獨立的字符串映射表,也可以放在集合裏。一個集合可以是一下任何類型:列表,有序表,無序表,哈希表等。單獨的字符串鍵值對很想一個可以接受字符串值的變量。
訪問數據
- MongoDB數據集是嵌套文檔,所以能按嵌套屬性值查詢,可以用點符號遍歷,訪問任何嵌套字段(db.orders.find( { “line_items.item.name” : “latte” } ) )。MongoDB的表達式匹配支持使用正則表達式。
在關係型數據庫中,索引很好改進了查詢速度,工作方式非常簡單,提供了基於B樹結構的查詢機制,MongoDB也支持索引,所有集合都按_id值索引。MongoDB還可自由建立二級索引,二級索引可以健在頂層字段或者嵌套字段上。
- HBase上基於行健的查詢是最簡單最高效的。行鍵是有序的,且連續的行健存儲在一起。行鍵建立很重要,應該在語義上與數據關聯起來。但是沒有二級索引。如果想要建立可以用第三方工具,如Lucene(搜索引擎框架)。
- Redis一般用get,還有集合操作等。
更新和刪除數據
- 關係型數據庫建立在ACID(原子性,一致性,隔離性,持久性)語義之上,以此爲基礎提供數據庫完整性,並對數據的更新和修改支持不同的隔離級別。
- NoSQL並不重視ACID事務。
- 鎖概念在NoSQL中不存在。但有些技巧可以幫助實現院子的數據更新,MongoDB是更新整個文檔而不是字段,可用原子性方法包括:
- $set,如{ $set : { "order_data" : new Date (2010, 10. 01 ) } }
- $inc
- $push
- $pushAll
- $pull
- $pullAll
- $set,如{ $set : { "order_data" : new Date (2010, 10. 01 ) } }
- 另一種策略是如果沒變就更新:
- 獲取對象
- 在本地修改對象
- 發送一個更新請求:如果對象還能匹配舊值的話,就把它更新成這個新值。
- 文檔或行級鎖,原子性也適用於HBase,其支持行級別的讀寫鎖。但是空行除外,因爲它會一直不可用知道超時。
- Redis支持有限的事務,一個操作可以在這樣的事務的範圍內執行。Redis的MULTI命令會初始化一個事務。執行MULTI以後用EXEC執行所有命令,用DISCARD回滾操作。
有限原子性和事務完整性
- CAP理論指出以下三個目標同時只能最大化兩個:
- 一致性:每個用戶都看到同樣的數據
- 可用性:每個用戶都可讀寫
- 分區容忍性:系統跨越分佈式物理網絡仍然工作良好。
- 最終一致性是用在並行編程和分佈式編程領域中的一致性模型。
- 給定足夠長一段時間,期間無更新,就可認爲所有更新最終會傳播到整個網絡,包括所有副本。
- 當存在持續的更新時,一個被接受的更新最終要麼到達副本,要麼重試。
- 與ACID相對,最終一致性表示基本可用(basically available),軟狀態(soft state),以及最終一致(eventual consistency),稱爲BASE。