NoSQL——CRUD操作

CRUD即是增刪查改操作,NoSQL是一類數據庫,其有一個共有的突出特徵:創建和讀取操作比更新和刪除操作更重要。

創建紀錄

  1. 唯一主鍵在關係型和非關係型數據庫中都很重要。
  2. MongoDB中沒有數據庫join的概念,因此要麼在客戶端利用對象標識符手工實現join操作,要麼利用DBRef。
  3. 面向列數據庫沒有定義任何關係引用的概念。因爲它也避免了集合之間的連接。列數據庫裏數據是這樣存儲的:每個行健唯一標識一條記錄,一個列族的所有列存儲在一起。面向列的數據庫,特別是HBase,也有一個保存數據的時間維度,這樣創建(插入)操作很重要,而沒有更新操作。

    HBase是數據的結構扁平化,只有列族和他包含的列之間纔有層次關係。此外,他還按照時間維度存儲每個單元格的數據,所以講數據存儲入HBase前,需要對嵌套的數據進行扁平化處理。

  4. Redis爲代表的鍵值對映射表是一種簡單強大的數據結構服務器,支持以簡單的鍵值對或者集合元素的形式來存儲數據。每個鍵值對可以是獨立的字符串映射表,也可以放在集合裏。一個集合可以是一下任何類型:列表,有序表,無序表,哈希表等。單獨的字符串鍵值對很想一個可以接受字符串值的變量。

訪問數據

  1. MongoDB數據集是嵌套文檔,所以能按嵌套屬性值查詢,可以用點符號遍歷,訪問任何嵌套字段(db.orders.find( { “line_items.item.name” : “latte” } ) )。MongoDB的表達式匹配支持使用正則表達式。

    在關係型數據庫中,索引很好改進了查詢速度,工作方式非常簡單,提供了基於B樹結構的查詢機制,MongoDB也支持索引,所有集合都按_id值索引。MongoDB還可自由建立二級索引,二級索引可以健在頂層字段或者嵌套字段上。

  2. HBase上基於行健的查詢是最簡單最高效的。行鍵是有序的,且連續的行健存儲在一起。行鍵建立很重要,應該在語義上與數據關聯起來。但是沒有二級索引。如果想要建立可以用第三方工具,如Lucene(搜索引擎框架)。
  3. Redis一般用get,還有集合操作等。

更新和刪除數據

  1. 關係型數據庫建立在ACID(原子性,一致性,隔離性,持久性)語義之上,以此爲基礎提供數據庫完整性,並對數據的更新和修改支持不同的隔離級別。
  2. NoSQL並不重視ACID事務。
  3. 鎖概念在NoSQL中不存在。但有些技巧可以幫助實現院子的數據更新,MongoDB是更新整個文檔而不是字段,可用原子性方法包括:
    1. $set,如{ $set : { "order_data" : new Date (2010, 10. 01 ) } }
    2. $inc
    3. $push
    4. $pushAll
    5. $pull
    6. $pullAll
  4. 另一種策略是如果沒變就更新:
    1. 獲取對象
    2. 在本地修改對象
    3. 發送一個更新請求:如果對象還能匹配舊值的話,就把它更新成這個新值。
  5. 文檔或行級鎖,原子性也適用於HBase,其支持行級別的讀寫鎖。但是空行除外,因爲它會一直不可用知道超時。
  6. Redis支持有限的事務,一個操作可以在這樣的事務的範圍內執行。Redis的MULTI命令會初始化一個事務。執行MULTI以後用EXEC執行所有命令,用DISCARD回滾操作。

有限原子性和事務完整性

  1. CAP理論指出以下三個目標同時只能最大化兩個:
    1. 一致性:每個用戶都看到同樣的數據
    2. 可用性:每個用戶都可讀寫
    3. 分區容忍性:系統跨越分佈式物理網絡仍然工作良好。
  2. 最終一致性是用在並行編程和分佈式編程領域中的一致性模型。
    1. 給定足夠長一段時間,期間無更新,就可認爲所有更新最終會傳播到整個網絡,包括所有副本。
    2. 當存在持續的更新時,一個被接受的更新最終要麼到達副本,要麼重試。
  3. 與ACID相對,最終一致性表示基本可用(basically available),軟狀態(soft state),以及最終一致(eventual consistency),稱爲BASE。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章