SQL還是NoSQL:12種數(shù)據(jù)存儲(chǔ)如何選擇?
你如何選擇一個(gè)數(shù)據(jù)庫(kù)?也許,您評(píng)估用例是否需要一個(gè)關(guān)系數(shù)據(jù)庫(kù)。根據(jù)答案,您可以選擇您喜歡的SQL或NoSQL數(shù)據(jù)存儲(chǔ),并使其工作。這是一個(gè)謹(jǐn)慎的策略:已知的魔鬼比一個(gè)未知的天使更好。
挑選正確的數(shù)據(jù)存儲(chǔ)可以簡(jiǎn)化您的應(yīng)用程序。錯(cuò)誤的選擇可以增加摩擦。本文將幫助您擴(kuò)展您的已知惡魔列表。它涵蓋以下內(nèi)容:
- 定義數(shù)據(jù)存儲(chǔ)特性的數(shù)據(jù)庫(kù)成分。
- 按數(shù)據(jù)類型分類的數(shù)據(jù)存儲(chǔ):非結(jié)構(gòu)化,結(jié)構(gòu)化(表格)和各種半結(jié)構(gòu)(NoSQL)類型。
- 專門用于各種用例的數(shù)據(jù)存儲(chǔ)。
- 決策流程圖導(dǎo)航在預(yù)級(jí)和云替代方向上的景觀。
數(shù)據(jù)庫(kù)
對(duì)數(shù)據(jù)庫(kù)工作原理有助于評(píng)估替代方案的高級(jí)了解。數(shù)據(jù)庫(kù)有5個(gè)組件:接口,查詢處理器,元數(shù)據(jù),索引和存儲(chǔ):
- 接口語言或API:每個(gè)數(shù)據(jù)庫(kù)定義了一種與之交互的語言或API。它涵蓋了數(shù)據(jù)和事務(wù)的定義,操作,查詢和控制。
- 查詢處理器:數(shù)據(jù)庫(kù)的“CPU”。它的工作是處理傳入的請(qǐng)求,執(zhí)行所需的操作,并返回結(jié)果。
- 存儲(chǔ):存儲(chǔ)數(shù)據(jù)的磁盤或內(nèi)存。
- 索引:數(shù)據(jù)結(jié)構(gòu)快速定位存儲(chǔ)中查詢的數(shù)據(jù)。
- 元數(shù)據(jù):數(shù)據(jù)的元信息,存儲(chǔ)。和索引(例如,目錄,架構(gòu),大小)。
查詢處理器為每個(gè)傳入請(qǐng)求執(zhí)行以下步驟:
- 解析請(qǐng)求并將其驗(yàn)證為元數(shù)據(jù)。
- 創(chuàng)建一個(gè)利用索引的有效執(zhí)行計(jì)劃。
- 讀取或更新存儲(chǔ)。
- 更新元數(shù)據(jù)和索引。
- 計(jì)算并返回結(jié)果。
要確定數(shù)據(jù)存儲(chǔ)區(qū)匹配您的應(yīng)用程序需求,您需要仔細(xì)檢查:
- 接口支持的操作。如果您需要的計(jì)算是內(nèi)置的,則需要編寫更少的代碼。
- 塊存儲(chǔ) Blob Storage.
在下一節(jié)中,讓我們?cè)跀?shù)據(jù)存儲(chǔ)中檢查各種數(shù)據(jù)類型的數(shù)據(jù)存儲(chǔ)中的操作和索引。
塊存儲(chǔ) Blob Storage.
文件系統(tǒng)是最簡(jiǎn)單和最舊的數(shù)據(jù)存儲(chǔ)。我們每天都使用它來存儲(chǔ)各種數(shù)據(jù)。Blob Storage是一種用于存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù)的超級(jí)分布式版本文件系統(tǒng)。
- Blob是二進(jìn)制大對(duì)象。您可以存儲(chǔ)任何類型的數(shù)據(jù)。因此,Blob數(shù)據(jù)存儲(chǔ)在解釋數(shù)據(jù)時(shí)沒有角色:
- Blob在文件級(jí)別支持CRUD(創(chuàng)建,讀取,更新,刪除)操作。
目錄或文件路徑是索引。
因此,您可以快速查找并讀取文件。但是在文件中找到某些內(nèi)容需要順序掃描。文檔,圖像,音頻和視頻文件存儲(chǔ)在Blob中。
表格數(shù)據(jù)存儲(chǔ)
表格數(shù)據(jù)存儲(chǔ)適用于存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù)。每個(gè)記錄(行)具有相同類型的屬性(列)的相同類型。
有兩種應(yīng)用:
- 在線事務(wù)處理(OLTP):捕獲,存儲(chǔ)和從事務(wù)中實(shí)時(shí)處理數(shù)據(jù)。
- 在線分析處理(OLAP):從OLTP應(yīng)用程序分析聚合的歷史數(shù)據(jù)。
OLTP應(yīng)用程序需要數(shù)據(jù)存儲(chǔ),支持低延遲讀取和單個(gè)記錄的寫入。OLAP應(yīng)用程序需要支持高吞吐量的數(shù)據(jù)存儲(chǔ)讀取大量(只讀)記錄。
關(guān)系或?qū)虻臄?shù)據(jù)庫(kù)
關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)是最早的數(shù)據(jù)存儲(chǔ)之一。數(shù)據(jù)在表中組織。表格歸一化以降低數(shù)據(jù)冗余和更好的數(shù)據(jù)完整性。
表可能具有主要和外鍵:
- 主鍵是一個(gè)最小的屬性(列),它唯一的標(biāo)識(shí)表中的記錄(行)。
- 外鍵在表格之間建立關(guān)系。它是一個(gè)表中的一組屬性,指的是另一個(gè)表的主鍵。
關(guān)系數(shù)據(jù)庫(kù)針對(duì)事務(wù)操作進(jìn)行了優(yōu)化。事務(wù)通常更新多個(gè)表中的多個(gè)記錄。索引針對(duì)頻繁的低延遲寫作ACID進(jìn)行了優(yōu)化:
- 原子性:更新多行的任何事務(wù)被視為單個(gè)單元。成功的交易執(zhí)行所有更新。失敗的事務(wù)執(zhí)行任何更新,即數(shù)據(jù)庫(kù)不變。
- 一致性:每個(gè)事務(wù)將數(shù)據(jù)庫(kù)從一個(gè)有效狀態(tài)帶到另一個(gè)。它保證維護(hù)所有數(shù)據(jù)庫(kù)不變性和約束。
- 隔離:多次事務(wù)的并發(fā)執(zhí)行在與事務(wù)順序執(zhí)行的情況下以與事務(wù)執(zhí)行相同的狀態(tài)離開數(shù)據(jù)庫(kù)。
- 耐用性:承諾的交易是永久性的,即使系統(tǒng)崩潰也是生存的。
有很多可供選擇:
- 非云:Oracle,Microsoft SQL Server,IBM DB2,PostgreSQL和MySQL
- AWS:在關(guān)系數(shù)據(jù)庫(kù)服務(wù)(RDS)中托管PostgreSQL和MySQL
- Microsoft Azure:托管SQL Server作為Azure SQL數(shù)據(jù)庫(kù)
- Google云:托管PostgreSQL和MySQL在Cloud SQL中,以及水平縮放云扳手
面向列的數(shù)據(jù)庫(kù)
雖然交易是行(記錄),但在列(屬性)上計(jì)算分析屬性。OLAP應(yīng)用程序需要在表上進(jìn)行優(yōu)化的列讀取操作。
通過將面向列的索引添加到關(guān)系數(shù)據(jù)庫(kù)來實(shí)現(xiàn)它的一種方法。例如:
- Microsoft SQL Server中的ColumnStore索引
- postgreSQL中的ColumnStore索引
但是,主RDBMS操作是低延遲的高頻率酸事務(wù)。這不會(huì)擴(kuò)展到分析應(yīng)用程序中常見的大數(shù)據(jù)規(guī)模。
對(duì)于大數(shù)據(jù),存儲(chǔ)在Blob存儲(chǔ)數(shù)據(jù)湖中變得流行。部分分析摘要計(jì)算并維持在OLAP多維數(shù)據(jù)集中。列儲(chǔ)存的規(guī)模和性能的進(jìn)步使OLAP多方面過時(shí)。但概念仍然與設(shè)計(jì)數(shù)據(jù)管道有關(guān)。
現(xiàn)代數(shù)據(jù)倉(cāng)庫(kù)是基于列存數(shù)據(jù)庫(kù)構(gòu)建的。數(shù)據(jù)由列而不是行存儲(chǔ)??捎眠x擇是:
- AWS:redshift
- Azure:synapse.
- 谷歌云:bigquery
- Apache:Druid,kudu,pinot
- 其他:Clickhouse,Snowflake
Databricks Delta Lake在數(shù)據(jù)湖泊中的數(shù)據(jù)上提供類似列存性能。
SQL與NoSQL:NoSQL和SQL之間的差異
非關(guān)系NoSQL數(shù)據(jù)存儲(chǔ)有兩個(gè)原因:
- RDBMS沒有為大數(shù)據(jù)水平擴(kuò)展
- 并非所有數(shù)據(jù)都適合嚴(yán)格的RDBMS架構(gòu)
NoSQL數(shù)據(jù)存儲(chǔ)在各種CAP定理權(quán)衡中提供水平刻度。根據(jù)CAP定理,分布式數(shù)據(jù)存儲(chǔ)可以在以下3個(gè)保證中提供最多2個(gè)保證:
- 一致性:每次讀取都會(huì)收到最近的寫入或錯(cuò)誤。
- 可用性:無論節(jié)點(diǎn)的各個(gè)狀態(tài)如何,每個(gè)請(qǐng)求都會(huì)獲得(非錯(cuò)誤)響應(yīng)。
- 分區(qū)容忍:盡管在節(jié)點(diǎn)之間的網(wǎng)絡(luò)丟棄(或延遲)丟棄了任意數(shù)量的消息,但群集不會(huì)失敗。
請(qǐng)注意,CAP定理和ACID事務(wù)中的一致性定義是不同的。ACID一致性是關(guān)于數(shù)據(jù)完整性的(數(shù)據(jù)是一致的w.r.t.每個(gè)交易后的關(guān)系和約束)。CAP是關(guān)于在任何給定時(shí)間彼此一致的所有節(jié)點(diǎn)的狀態(tài)。
只有少數(shù)NoSQL數(shù)據(jù)存儲(chǔ)是ACID。大多數(shù)NoSQL數(shù)據(jù)存儲(chǔ)支持基礎(chǔ)模型:
- 基本可用性:數(shù)據(jù)在許多存儲(chǔ)系統(tǒng)上復(fù)制,大部分時(shí)間都可用。
- 軟狀態(tài):復(fù)制品一直不是一致;因此,國(guó)家可能只會(huì)部分正確,因?yàn)樗赡苌胁蝗诤稀?/li>
- 最終的一致性:數(shù)據(jù)將在未來某些時(shí)候一致,但沒有保證。
NoSQL和SQL數(shù)據(jù)庫(kù)之間的差異是:
- 數(shù)據(jù):SQL DBS用于嚴(yán)格遵守關(guān)系模式的標(biāo)準(zhǔn)化結(jié)構(gòu)化(表格)數(shù)據(jù)。
- 事務(wù):所有SQL DBS支持酸事務(wù),但大多數(shù)NoSQL數(shù)據(jù)存儲(chǔ)提供基礎(chǔ)事務(wù)。
- CAP權(quán)衡:SQL DBS優(yōu)先考慮到其他一切的一致性。但是,NoSQL數(shù)據(jù)存儲(chǔ)通常優(yōu)先考慮可用性和分區(qū)公差(水平縮放)并提供最終的一致性。
NoSQL用于半結(jié)構(gòu)化數(shù)據(jù)類型:
NoSQL數(shù)據(jù)存儲(chǔ)迎合半結(jié)構(gòu)數(shù)據(jù):鍵值,寬柱,文檔(樹)和圖形。
鍵值數(shù)據(jù)存儲(chǔ)
鍵值存儲(chǔ)是字典或哈希表數(shù)據(jù)庫(kù)。它專為CRUD操作而設(shè)計(jì),每個(gè)記錄都有一個(gè)唯一的鍵:
- create(key,value):將鍵值對(duì)添加到數(shù)據(jù)存儲(chǔ)區(qū)
- 讀(鍵):查找與密鑰關(guān)聯(lián)的值
- 更新(鍵,value):更改密鑰的現(xiàn)有值
- 刪除(鍵):從數(shù)據(jù)存儲(chǔ)區(qū)中刪除(鍵,值)記錄
值沒有固定的模式,并且可以是從原始值到復(fù)合結(jié)構(gòu)的任何內(nèi)容。鍵值存儲(chǔ)是高度分區(qū)的(因此水平縮放)。Redis是一個(gè)受歡迎的鑰匙價(jià)值商店。
寬列數(shù)據(jù)存儲(chǔ)
寬列商店具有表,行和列。但是列的名稱及其類型對(duì)于同一表中的每一行可能是不同的。邏輯上,它是一個(gè)具有多維映射的版本的稀疏矩陣(行 - 值,列值,時(shí)間戳)。它就像一個(gè)二維鍵值存儲(chǔ),每個(gè)單元格值都有一個(gè)時(shí)間戳。
寬列數(shù)據(jù)存儲(chǔ)是高度分區(qū)的。它具有存儲(chǔ)在一起的列族的概念。單元格的邏輯坐標(biāo)是:(行鍵,列名,版本)。物理查找如下:區(qū)域字典⇒列族目錄⇒行鍵⇒列姓名⇒列限定符⇒版本。因此,寬列存儲(chǔ)實(shí)際上是面向行的數(shù)據(jù)庫(kù)。
Apache HBase是第一個(gè)開源廣域數(shù)據(jù)存儲(chǔ)。在實(shí)踐中查看HBase,用于寬柱數(shù)據(jù)存儲(chǔ)的核心概念。
文檔數(shù)據(jù)存儲(chǔ)
文檔存儲(chǔ)用于存儲(chǔ)和檢索由嵌套對(duì)象組成的文檔。樹結(jié)構(gòu),如XML,JSON和YAML。
在鍵值存儲(chǔ)中,該值是不透明的。但是文檔存儲(chǔ)利用該值的樹結(jié)構(gòu)來提供更豐富的操作。MongoDB是文檔商店的一個(gè)流行示例。
圖形數(shù)據(jù)存儲(chǔ)
圖表數(shù)據(jù)庫(kù)就像文檔存儲(chǔ),但是為圖形而不是文檔樹設(shè)計(jì)。例如,圖形數(shù)據(jù)庫(kù)將適合存儲(chǔ)和查詢社交連接網(wǎng)絡(luò)。
neo4j是一個(gè)突出的圖表數(shù)據(jù)庫(kù)。在寬列商店上使用Janusgraph類型的索引也是很常見的。
用例
各種類型的NoSQL數(shù)據(jù)存儲(chǔ)之間的樣本是模糊的。偶爾,即使是SQL和NOSQL之間的線條是模糊的(PostgreSQL作為鍵值存儲(chǔ)和PostgreSQL為JSON文檔DB)。
數(shù)據(jù)存儲(chǔ)可以通過為該數(shù)據(jù)類型添加索引和操作來傳動(dòng)以提供另一種類似的數(shù)據(jù)類型。初始柱狀OLAP數(shù)據(jù)庫(kù)是具有列存儲(chǔ)索引的RDBMS。NoSQL商店相同,用于支持多種數(shù)據(jù)類型。
這就是為什么要考慮用例并選擇適合您的應(yīng)用程序的數(shù)據(jù)存儲(chǔ)。用于多個(gè)用例的數(shù)據(jù)存儲(chǔ)可能有助于減少開銷。
具有適用于用例的內(nèi)置操作的數(shù)據(jù)存儲(chǔ)是首選(而不是在每個(gè)應(yīng)用程序中實(shí)現(xiàn)這些操作)。
內(nèi)存密鑰值數(shù)據(jù)存儲(chǔ)
與鍵值存儲(chǔ)相同,但數(shù)據(jù)位于內(nèi)存而不是磁盤上。它消除了磁盤IO開銷,并用作快速緩存。
時(shí)間序列數(shù)據(jù)存儲(chǔ)
時(shí)間序列是一系列數(shù)據(jù)點(diǎn),由時(shí)間戳索引和訂購(gòu)。時(shí)間戳是時(shí)間序列數(shù)據(jù)存儲(chǔ)中的關(guān)鍵。
時(shí)間序列可以建模:
- 鍵值:相關(guān)對(duì)時(shí)間戳和值對(duì)
- 寬柱:使用時(shí)間戳作為表的鑰匙
具有來自編程語言的日期時(shí)間函數(shù)的寬專欄存儲(chǔ)通常用作時(shí)間序列數(shù)據(jù)庫(kù)。
在分析應(yīng)用程序中,柱狀數(shù)據(jù)庫(kù)也可用于時(shí)間序列數(shù)據(jù)。
不可變分類帳數(shù)據(jù)集
不可變分類帳用于維護(hù)中央可信任權(quán)限所擁有的不變和(加密)可驗(yàn)證的交易日志。
從存儲(chǔ)角度來看,一個(gè)寬的列商品就足夠了。但是數(shù)據(jù)存儲(chǔ)行動(dòng)必須是不可變和可驗(yàn)證的。很少有數(shù)據(jù)存儲(chǔ)(例如Amazon QLDB和Hyperlowger Fabric)目前滿足這些要求。
地理空間數(shù)據(jù)存儲(chǔ)
地理空間數(shù)據(jù)庫(kù)是一個(gè)數(shù)據(jù)庫(kù),用于存儲(chǔ)地理數(shù)據(jù)(例如國(guó)家,城市等)。它針對(duì)地理空間查詢和幾何操作進(jìn)行了優(yōu)化。
具有地理空間查詢的寬列,鍵值,文檔或關(guān)系數(shù)據(jù)庫(kù)通常用于此目的:
- postgis擴(kuò)展到postgreSQL
- MongoDB的Geojson對(duì)象
文本搜索數(shù)據(jù)存儲(chǔ)
非結(jié)構(gòu)化(自然)或半結(jié)構(gòu)化文本的文本搜索是許多應(yīng)用程序中的常見操作。文本可以是普通或富有的(例如pdf),存儲(chǔ)在文檔數(shù)據(jù)庫(kù)中,或存儲(chǔ)在Blob Store中。彈性搜索是一個(gè)流行的解決方案。
數(shù)據(jù)存儲(chǔ)選擇作弊表
鑒于這么多的數(shù)據(jù)類型,使用案例,選擇,應(yīng)用程序注意事項(xiàng)和云/ inum / insum約束,它可能會(huì)耗時(shí)來分析所有選項(xiàng)。下面的決策流程圖是幫助您快速簽名少數(shù)候選人。
等待學(xué)習(xí)做出選擇所需的一切是不切實(shí)際的。這個(gè)作弊表將很少有合理的選擇開始。它是通過設(shè)計(jì)簡(jiǎn)化的,并且不存在一些細(xì)微差別和選擇。它針對(duì)召回而不是精度進(jìn)行了優(yōu)化。
概括
本文通過各種數(shù)據(jù)存儲(chǔ)選擇,并解釋了如何根據(jù)以下方式選擇:
- 應(yīng)用:交易或分析
- 數(shù)據(jù)類型(SQL VS. NOSQL):結(jié)構(gòu)化,半結(jié)構(gòu),非結(jié)構(gòu)化
- 用例
- 部署:主要云提供商,在附近,供應(yīng)商鎖定考慮因素
資源:
- AWS上的數(shù)據(jù)庫(kù)服務(wù)
- AWS白皮書:亞馬遜Web服務(wù)概述 - 數(shù)據(jù)庫(kù)
- 如何選擇合適的數(shù)據(jù)庫(kù) - AWS技術(shù)內(nèi)容系列
- 了解Azure數(shù)據(jù)存儲(chǔ)型號(hào)
- Azure上的數(shù)據(jù)庫(kù)類型
- 谷歌云數(shù)據(jù)庫(kù)服務(wù)
- Google云平臺(tái)上的數(shù)據(jù)生命周期和數(shù)據(jù)庫(kù)選擇
原文鏈接:https://towardsdatascience.com/datastore-choices-sql-vs-nosql-database-ebec24d56106)