1. 程式人生 > >NoSql非關係型資料庫

NoSql非關係型資料庫

  • 簡介
    • 誕生的原因:
      • 隨著網際網路的不斷髮展,各種型別的應用層出不窮,所以導致在這個雲端計算的時代,對技術提出了更多的需求,低延遲的讀寫速度\ 支撐海量的資料和流量\大規模叢集的管理。
      • 關係型資料庫又有一些天生的限制
        • 擴充套件困難:由於存在類似Join這樣多表查詢機制,使得資料庫在擴充套件方面很艱難;
        • 讀寫慢:這種情況主要發生在資料量達到一定規模時由於關係型資料庫的系統邏輯非常複雜,使得其非常容易發生死鎖等的併發問題,所以導致其讀寫速度下滑非常嚴重;
        • 成本高:企業級資料庫的License價格很驚人,並且隨著系統的規模,而不斷上升;
        • 有限的支撐容量:現有關係型解決方案還無法支撐Google這樣海量的資料儲存;
      • 對於Nosql來說,在設計上,它們非常關注對資料高併發地讀寫和對海量資料的儲存等,與關係型資料庫相比,它們在架構和資料模型方量面做了“減法”,而在擴充套件和併發等方面做了“加法”。現在主流的NoSQL資料庫有BigTable、HBase、Cassandra、SimpleDB、CouchDB、MongoDB和Redis等。
    • NoSQL 是一項非關係型的資料儲存
    • 其餘的一些為關係型資料儲存:
      • 關係型儲存遵守ACID準則(原子性\一致性\獨立性\永續性)
    • 定義:NoSQL,指的是非關係型的資料庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。
    • NoSQL用於超大規模資料的儲存。
  • 為什麼要使用NoSql資料庫&&關係資料庫還是NoSQL資料庫
    • 此內容不再贅述,前人種樹,後人乘涼,連結:http://blog.csdn.net/u012377333/article/details/50598519
  • 優點:
    • 高可擴充套件性(向上擴充套件與水平擴充套件)
    • 快速的讀寫:主要例子有Redis,由於其邏輯簡單,而且純記憶體操作,使得其效能非常出色,單節點每秒可以處理超過10萬次讀寫操作;
    • 分散式計算
    • 低成本
    • 架構的靈活性,半結構化資料
    • 沒有複雜的關係
  • 缺點
    • 沒有標準化
    • 有限的查詢功能
    • 最終一致是不直觀的程式
  • Nosql資料庫分類
    • 列儲存
      • 按列進行儲存
      • 方便儲存結構化和半結構化資料
      • 對列的查詢有相當大的io優勢
      • Hbase
    • 文件儲存
      • 用於類似json的格式儲存
      • MongoDB
    • key-value儲存
      • key快速查詢到其value
      • Redis
    • 圖儲存
      • 圖形關係的最佳儲存
    • 物件儲存
      • 通過類似於面向物件語法操作資料庫,通過物件的方式儲存資料
      • db4o
      • Versant
    • xml資料庫
      • 高效儲存xml資料
      • BaseX
  • NoSql與普通關係型資料庫的區別
    • 儲存方式
      • 關係型資料庫是表格式的,因此儲存在 表的行和列中。他們之間很容易關聯協作儲存,提取資料很方便。而Nosql資料庫則與其相反,他是大塊的組合在一起。通常儲存在資料集中,就像文件、鍵值對或者圖結構。
    • 儲存結構
      •  關係型資料庫對應的是結構化資料,資料表都預先定義了結構(列的定義),結構描述了資料的形式和內容。這一點對資料建模至關重要,雖然預定義結構帶來了可靠性和穩定性,但是修改這些資料比較困難。而Nosql資料庫基於動態結構,使用與非結構化資料。因為Nosql資料庫是動態結構,可以很容易適應資料型別和結構的變化。
    • 儲存規範
      • 關係型資料庫的資料儲存為了更高的規範性,把資料分割為最小的關係表以避免重複,獲得精簡的空間利用。雖然管理起來很清晰,但是單個操作設計到多張表的時候,資料管理就顯得有點麻煩。而Nosql資料儲存在平面資料集中,資料經常可能會重複。單個數據庫很少被分隔開,而是儲存成了一個整體,這樣整塊資料更加便於讀寫
    • 儲存擴充套件
      • 這可能是兩者之間最大的區別,關係型資料庫是縱向擴充套件,也就是說想要提高處理能力,要使用速度更快的計算機。因為資料儲存在關係表中,操作的效能瓶頸可能涉及到多個表,需要通過提升計算機效能來克服。雖然有很大的擴充套件空間,但是最終會達到縱向擴充套件的上限。而Nosql資料庫是橫向擴充套件的,它的儲存天然就是分散式的,可以通過給資源池新增更多的普通資料庫伺服器來分擔負載。
    • 查詢方式
      • 關係型資料庫通過結構化查詢語言來操作資料庫(就是我們通常說的SQL)。SQL支援資料庫CURD操作的功能非常強大,是業界的標準用法。而Nosql查詢以塊為單元操作資料,使用的是非結構化查詢語言(UnQl),它是沒有標準的。關係型資料庫表中主鍵的概念對應Nosql中儲存文件的ID。關係型資料庫使用預定義優化方式(比如索引)來加快查詢操作,而Nosql更簡單更精確的資料訪問模式。
    • 事務
      • 關係型資料庫遵循ACID規則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)),而Nosql資料庫遵循BASE原則(基本可用(Basically Availble)、軟/柔性事務(Soft-state )、最終一致性(Eventual Consistency))。由於關係型資料庫的資料強一致性,所以對事務的支援很好。關係型資料庫支援對事務原子性細粒度控制,並且易於回滾事務。而Nosql資料庫是在CAP(一致性、可用性、分割槽容忍度)中任選兩項,因為基於節點的分散式系統中,很難全部滿足,所以對事務的支援不是很好,雖然也可以使用事務,但是並不是Nosql的閃光點。
    • 效能
      • 關係型資料庫為了維護資料的一致性付出了巨大的代價,讀寫效能比較差。在面對高併發讀寫效能非常差,面對海量資料的時候效率非常低。而Nosql儲存的格式都是key-value型別的,並且儲存在記憶體中,非常容易儲存,而且對於資料的 一致性是 弱要求。Nosql無需sql的解析,提高了讀寫效能。
    • 授權方式
      • 關係型資料庫通常有SQL Server,Mysql,Oracle。主流的Nosql資料庫有redis,memcache,MongoDb。大多數的關係型資料庫都是付費的並且價格昂貴,成本較大,而Nosql資料庫通常都是開源的。