1. 程式人生 > >學了那麼多 NoSQL 資料庫 NoSQL 究竟是啥

學了那麼多 NoSQL 資料庫 NoSQL 究竟是啥

![](https://mrhelloworld.com/resources/articles/nosql/ef7669653bdf4852be035c37612e0b7e_th.jpeg) ## NoSQL 簡史      NoSQL 一詞最早出現於 1998 年,是 Carlo Strozzi 開發的一個輕量、開源、不提供 SQL 功能的關係資料庫。   2009 年,Last.fm 的 Johan Oskarsson 發起了一次關於分散式開源資料庫的討論,來自 Rackspace 的 Eric Evans 再次提出了 NoSQL 的概念,這時的 NoSQL 主要指非關係型、分散式、不提供 ACID 的資料庫設計模式。   2009 年在亞特蘭大舉行的"no:sql(east)"討論會是一個里程碑,其口號是"select fun, profit from real_world where relational=false"。因此,對 NoSQL 最普遍的解釋是"非關聯型的",強調 Key-Value Stores 和文件資料庫的優點,而不是單純的反對 RDBMS。    ## 什麼是 NoSQL    ![](https://mrhelloworld.com/resources/articles/nosql/snipaste_20171018_171633-4bbf0a62-0488-45dc-a7fc-8dbc81f59483.jpg)   `NoSQL(Not Only SQL)`,意思是"**不僅僅是 SQL**",指的是非關係型資料庫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。   NoSQL 用於超大規模資料的儲存。這些型別的資料儲存不需要固定的模式,無需多餘操作就可以橫向擴充套件。    ## 為什麼使用 NoSQL      隨著網際網路的飛速發展與普及,網民上網衝浪時所產生資料也逐日增多,從 GB 到 TB 到 PB。這些資料有很大一部分都是由關係型資料庫管理系統(RDBMS)來進行處理的。   由於關係型資料庫的正規化約束、事務特性、磁碟 IO 等特點,若伺服器使用關係型資料庫,當有大量資料產生時,傳統的關係型資料庫已經無法滿足快速查詢與插入資料的需求。NoSQL 的出現解決了這一危機。它通過降低資料的安全性,減少對事務的支援,減少對複雜查詢的支援,獲取效能上的提升。但是,在某些特定場景下 NoSQL 仍然不是最佳人選,比如一些絕對要有事務與安全指標的場景。   NoSQL 是一項全新的資料庫革命性運動,早期就有人提出,發展至 2009 年趨勢越發高漲。NoSQL 的擁護者們提倡運用非關係型的資料儲存,相對於鋪天蓋地的關係型資料庫運用,這一概念無疑是一種全新的思維的注入。    ## RDBMS vs. NoSQL    ![](https://mrhelloworld.com/resources/articles/nosql/image-20201020152827783.png)    ## 常見的資料庫管理系統      根據 [DB-Engines](https://db-engines.com/en/ranking):https://db-engines.com/en/ranking 的排行,本文截取了排行榜 Top 50 如下圖所示。DB-Engines 排名根據資料庫管理系統的受歡迎程度對其進行排名。該排名每月更新一次。 ![](https://mrhelloworld.com/resources/articles/nosql/db.png)    ## NoSQL 資料庫四大家族    ### 鍵值(Key-Value)儲存      **特點**:鍵值資料庫就像傳統語言中使用的雜湊表。通過 Key 新增、查詢或者刪除資料。   **優點**:查詢速度快。   **缺點**:資料無結構化,通常只被當作字串或者二進位制資料儲存。   **應用場景**:內容快取、使用者資訊比如會話、配置資訊、購物車等,主要用於處理大量資料的高訪問負載。   **NoSQL 代表**:Redis、Memcached...    ### 文件(Document-Oriented)儲存      **特點**:文件資料庫將資料以文件的形式儲存,類似 JSON,是一系列資料項的集合。每個資料項都有一個名稱與對應的值,值既可以是簡單的資料型別,如字串、數字和日期等;也可以是複雜的型別,如有序列表和關聯物件。   **優點**:資料結構要求不嚴格,表結構可變,不需要像關係型資料庫一樣需要預先定義表結構。   **缺點**:查詢效能不高,缺乏統一的查詢語法。   **應用場景**:日誌、 Web 應用等。   **NoSQL 代表**:MongoDB、CouchDB...    ### 列(Wide Column Store/Column-Family)儲存      **特點**:列儲存資料庫將資料儲存在列族(Column Family)中,將多個列聚合成一個列族,鍵仍然存在,但是它們的特點是指向了多個列。舉個例子,如果我們有一個 Person 類,我們通常會一起查詢他們的姓名和年齡而不是薪資。這種情況下,姓名和年齡就會被放入一個列族中,而薪資則在另一個列族中。   **優點**:列儲存查詢速度快,可擴充套件性強,更容易進行分散式擴充套件,適用於分散式的檔案系統,應對分散式儲存的海量資料。   **缺點**:查詢效能不高,缺乏統一的查詢語法。   **應用場景**:日誌、 分散式的檔案系統(物件儲存)、推薦畫像、時空資料、訊息/訂單等。   **NoSQL 代表**:Cassandra、HBase...    ### 圖形(Graph-Oriented)儲存      **特點**:圖形資料庫允許我們將資料以圖的方式儲存。   **優點**:圖形相關演算法。比如最短路徑定址,N 度關係查詢等。   **缺點**:很多時候需要對整個圖做計算才能得出需要的資訊,分散式的叢集方案不好做,處理超級節點乏力,沒有分片儲存機制,國內社群不活躍。   **應用場景**:社交網路,推薦系統等。專注於構建關係圖譜。   **NoSQL 代表**:Neo4j、Infinite Graph...    ## NoSQL 的優缺點    ### 優點    - 高可擴充套件性 - 沒有標準化 - 分散式計算 - 有限的查詢功能(到目前為止) - 低成本    ### 缺點    - 最終一致是不直觀的程式 - 架構的靈活性,半結構化資料 - 沒有複雜的關係    ### 總結      NoSQL 資料庫在以下幾種情況下比較適用: - 資料模型比較簡單 - 需要靈活性更強的 IT 系統 - 對資料庫效能要求較高 - 不需要高度的資料一致性 - 對於給定的 Key,比較容易映射覆雜值的環境 ![](https://user-gold-cdn.xitu.io/2020/5/1/171cf87f564bc82e?w=433&h=133&f=gif&s=333013) 本文采用 `知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議`。 大家可以通過 `分類` 檢視更多關於 `NoSQL` 的文章。