一網打盡當下NoSQL型別、適用場景及使用公司
在過去幾年,關係型資料庫一直是資料持久化的唯一選擇,資料工作者考慮的也只是在這些傳統資料庫中做篩選,比如SQL Server、Oracle或者是MySQL。甚至是做一些預設的選擇,比如使用.NET的一般會選擇SQL Server;使用Java的可能會偏向Oracle,Ruby是MySQL,Python則是PostgreSQL或MySQL等等。
原因很簡單:過去很長一段時間內,關聯式資料庫的健壯性已經在多數應用程式中得到證實。我們可以使用這些傳統資料庫良好的控制併發操作、事務等等。然而如果傳統的關係型資料庫一直這麼可靠,那麼還有NoSQL什麼事?NoSQL之所以生存並得到發展,是因為它做到了傳統關係型資料庫做不到的事!
關係型資料庫中存在的問題
Impedance Mismatch
我們使用Python、Ruby、Java、.Net等語言編寫應用程式,這些語言有一個共同的特性——物件導向。但是我們使用MySQL、PostgreSQL、Oracle以及SQL Server,這些資料庫同樣有一個共同的特性——關係型資料庫。這裡就牽扯到了“Impedance Mismatch”這個術語:儲存結構是物件導向的,但是資料庫卻是關係的,所以在每次儲存或者查詢資料時,我們都需要做轉換。類似Hibernate、Entity Framework這樣的ORM框架確實可以簡化這個過程,但是在對查詢有高效能需求時,這些ORM框架就捉襟見肘了。
應用程式規模的變大
網路應用程式的規模日漸變大,我們需要儲存更多的資料、服務更多的使用者以及需求更多的計算能力。為了應對這種情形,我們需要不停的擴充套件。擴充套件分為兩類:一種是縱向擴充套件,即購買更好的機器,更多的磁碟、更多的記憶體等等;另一種是橫向擴充套件,即購買更多的機器組成叢集。在巨大的規模下,縱向擴充套件發揮的作用並不是很大。首先單機器效能提升需要鉅額的開銷並且有著效能的上限,在Google和Facebook這種規模下,永遠不可能使用一臺機器支撐所有的負載。鑑於這種情況,我們需要新的資料庫,因為關聯式資料庫並不能很好的執行在叢集上。不錯你也可能會去搭建關聯式資料庫叢集,但是他們使用的是共享儲存,這並不是我們想要的型別。於是就有了以Google、Facebook、Amazon這些試圖處理更多傳輸所引領的NoSQL紀元。
NoSQL紀元
當下已經存在很多的NoSQL資料庫,比如MongoDB、Redis、Riak、HBase、Cassandra等等。每一個都擁有以下幾個特性中的一個:
- 不再使用SQL語言,比如MongoDB、Cassandra就有自己的查詢語言
- 通常是開源專案
- 為叢集執行而生
- 弱結構化——不會嚴格的限制資料結構型別
NoSQL資料庫的型別
NoSQL可以大體上分為4個種類:Key-value、Document-Oriented、Column-Family Databases以及 Graph-Oriented Databases。下面就一覽這些型別的特性:
一、 鍵值(Key-Value)資料庫
鍵值資料庫就像在傳統語言中使用的雜湊表。你可以通過key來新增、查詢或者刪除資料,鑑於使用主鍵訪問,所以會獲得不錯的效能及擴充套件性。
產品:Riak、Redis、Memcached、Amazon’s Dynamo、Project Voldemort
有誰在使用:GitHub (Riak)、BestBuy (Riak)、Twitter (Redis和Memcached)、StackOverFlow (Redis)、 Instagram (Redis)、Youtube (Memcached)、Wikipedia(Memcached)
適用的場景
儲存使用者資訊,比如會話、配置檔案、引數、購物車等等。這些資訊一般都和ID(鍵)掛鉤,這種情景下鍵值資料庫是個很好的選擇。
不適用場景
1. 取代通過鍵查詢,而是通過值來查詢。Key-Value資料庫中根本沒有通過值查詢的途徑。
2. 需要儲存資料之間的關係。在Key-Value資料庫中不能通過兩個或以上的鍵來關聯資料。
3. 事務的支援。在Key-Value資料庫中故障產生時不可以進行回滾。
二、 面向文件(Document-Oriented)資料庫
面向文件資料庫會將資料以文件的形式儲存。每個文件都是自包含的資料單元,是一系列資料項的集合。每個資料項都有一個名稱與對應的值,值既可以是簡單的資料型別,如字串、數字和日期等;也可以是複雜的型別,如有序列表和關聯物件。資料儲存的最小單位是文件,同一個表中儲存的文件屬性可以是不同的,資料可以使用XML、JSON或者JSONB等多種形式儲存。
產品:MongoDB、CouchDB、RavenDB
有誰在使用:SAP (MongoDB)、Codecademy (MongoDB)、Foursquare (MongoDB)、NBC News (RavenDB)
適用的場景
1. 日誌。企業環境下,每個應用程式都有不同的日誌資訊。Document-Oriented資料庫並沒有固定的模式,所以我們可以使用它儲存不同的資訊。
2. 分析。鑑於它的弱模式結構,不改變模式下就可以儲存不同的度量方法及新增新的度量。
不適用場景
在不同的文件上新增事務。Document-Oriented資料庫並不支援文件間的事務,如果對這方面有需求則不應該選用這個解決方案。
三、 列儲存(Wide Column Store/Column-Family)資料庫
列儲存資料庫將資料儲存在列族(column family)中,一個列族儲存經常被一起查詢的相關資料。舉個例子,如果我們有一個Person類,我們通常會一起查詢他們的姓名和年齡而不是薪資。這種情況下,姓名和年齡就會被放入一個列族中,而薪資則在另一個列族中。
產品:Cassandra、HBase
有誰在使用:Ebay (Cassandra)、Instagram (Cassandra)、NASA (Cassandra)、Twitter (Cassandra and HBase)、Facebook (HBase)、Yahoo!(HBase)
適用的場景
1. 日誌。因為我們可以將資料儲存在不同的列中,每個應用程式可以將資訊寫入自己的列族中。
2. 部落格平臺。我們儲存每個資訊到不同的列族中。舉個例子,標籤可以儲存在一個,類別可以在一個,而文章則在另一個。
不適用場景
1. 如果我們需要ACID事務。Vassandra就不支援事務。
2. 原型設計。如果我們分析Cassandra的資料結構,我們就會發現結構是基於我們期望的資料查詢方式而定。在模型設計之初,我們根本不可能去預測它的查詢方式,而一旦查詢方式改變,我們就必須重新設計列族。
四、 圖(Graph-Oriented)資料庫
圖資料庫允許我們將資料以圖的方式儲存。實體會被作為頂點,而實體之間的關係則會被作為邊。比如我們有三個實體,Steve Jobs、Apple和Next,則會有兩個“Founded by”的邊將Apple和Next連線到Steve Jobs。
產品:Neo4J、Infinite Graph、OrientDB
有誰在使用:Adobe (Neo4J)、Cisco (Neo4J)、T-Mobile (Neo4J)
適用的場景
1. 在一些關係性強的資料中
2. 推薦引擎。如果我們將資料以圖的形式表現,那麼將會非常有益於推薦的制定
不適用場景
不適合的資料模型。圖資料庫的適用範圍很小,因為很少有操作涉及到整個圖。
原文連結: NoSQL Databases, why we should use, and which one we should choose
相關文章
- list與Set、Map區別及適用場景
- redis資料型別及應用場景Redis資料型別
- Redis 資料型別及應用場景Redis資料型別
- Redis系列-資料型別及使用場景Redis資料型別
- Redis set資料型別命令使用及應用場景使用總結Redis資料型別
- 一網打盡2013最常用的NoSQL資料庫SQL資料庫
- redis的五種資料型別及應用場景Redis資料型別
- Spark適用於哪些場景?不適用於哪些場景?Spark
- 阿里P8架構師談:NoSQL和SQL的區別,NoSQL的使用場景和選型比較阿里架構SQL
- CDN適用哪些場景?
- CDN網路加速適合那些場景使用?
- 輪換代理介紹及適用場景介紹
- NodeJS優缺點及適用場景討論NodeJS
- Java中的引用型別和使用場景Java型別
- Redis 知多少 (二)---Redis 基本資料型別及常用應用場景Redis資料型別
- 網頁輸入框日期型有效性判定一網打盡 (轉)網頁
- Apache Hudi核心概念一網打盡Apache
- Redis 中ZSET資料型別命令使用及對應場景總結Redis資料型別
- 泛型使用場景泛型
- INDEX SKIP SCAN適用場景Index
- 物件儲存適用於哪些場景?這5個場景皆可使用!物件
- Redis五種資料型別應用場景Redis資料型別
- Redis中7種集合型別應用場景Redis型別
- String資料型別的應用場景資料型別
- sorted set 資料型別的應用場景資料型別
- NoSQL資料庫的35個應用場景SQL資料庫
- Redis多種資料型別以及使用場景Redis資料型別
- 面試官:Redis有幾種資料型別,詳細說一下每種資料型別的使用場景面試Redis資料型別
- 一文徹底搞透Redis的資料型別及具體的應用場景Redis資料型別
- 一網打盡列舉操作 .net core
- 一網打盡非同步神器CompletableFuture非同步
- 深入SQLite,一網打盡“危險操作”SQLite
- Streaming特性和適用場景
- 設計模式適用場景整理設計模式
- SPM適用的場景和示例
- Webpack 下使用 web workers 及 基本原理 和 應用場景Web
- TypeScript 中列舉型別的理解?應用場景?TypeScript型別
- python中 _、__、__xx__() 區別及使用場景Python