如今,有數(shù)百個(gè)SQL和NoSQL數(shù)據(jù)庫(kù)。其中有些數(shù)據(jù)庫(kù)很受歡迎,有些數(shù)據(jù)庫(kù)則被忽略;有些是用戶比較喜歡使用的并且有據(jù)可查,有些則很難使用;有些數(shù)據(jù)庫(kù)是開(kāi)源的,有些是專有的;最重要的是有些數(shù)據(jù)庫(kù)是可伸縮的,優(yōu)化的,高度可用的,而有些則很難擴(kuò)展或維護(hù)。有一個(gè)自然的問(wèn)題:如何選擇數(shù)據(jù)庫(kù)?為了回答這個(gè)問(wèn)題,我們應(yīng)該決定要使用數(shù)據(jù)庫(kù)實(shí)現(xiàn)的目標(biāo)。要?jiǎng)?chuàng)建視圖,我們應(yīng)該回答以下問(wèn)題:我們需要對(duì)數(shù)據(jù)庫(kù)的分析訪問(wèn)嗎?我們需要實(shí)時(shí)書(shū)寫(xiě)或閱讀嗎?我們要存儲(chǔ)多少?gòu)埍?記錄?我們需要什么可用性?我們需要列嗎?我們將訪問(wèn)按列過(guò)濾還是按行過(guò)濾的表?
做出決定后,我們需要牢記一個(gè)或另一個(gè)數(shù)據(jù)庫(kù)能夠提供的內(nèi)容。每個(gè)數(shù)據(jù)庫(kù)的特定功能可能會(huì)有所不同,但是通常,只有少數(shù)幾種類型的數(shù)據(jù)庫(kù)。在這些類型中,我們可以實(shí)現(xiàn)幾乎相同的目標(biāo)。讓我們仔細(xì)看看它們。
1. SQL關(guān)系數(shù)據(jù)庫(kù)
如果您曾經(jīng)使用過(guò)數(shù)據(jù)庫(kù),則很可能已經(jīng)開(kāi)始使用這種類型的數(shù)據(jù)庫(kù)。這種類型是最流行和廣泛使用的。這些數(shù)據(jù)庫(kù)允許將數(shù)據(jù)存儲(chǔ)在具有特定類型的已定義列的關(guān)系表中。關(guān)系表是良好的規(guī)范化和聯(lián)接。
好處
SQL支持
ACID事務(wù)(原子性,一致性,隔離性和持久性)
索引和分區(qū)支持
缺點(diǎn)
對(duì)非結(jié)構(gòu)化數(shù)據(jù)/復(fù)雜類型的支持不佳
錯(cuò)誤的事件處理優(yōu)化
困難/昂貴的縮放
示例:Oracle DB,MySQL,PostgreSQL。
2.面向文檔的數(shù)據(jù)庫(kù)
如果我們不想連接多個(gè)表來(lái)檢索所需的數(shù)據(jù),我們可以看一下面向文檔的數(shù)據(jù)庫(kù)。這些數(shù)據(jù)庫(kù)允許以類似JSON的格式存儲(chǔ)記錄。使用這種格式,我們可以為任何鍵創(chuàng)建復(fù)雜的值,并將所有數(shù)據(jù)結(jié)構(gòu)一次包含在一條記錄中。
好處
無(wú)架構(gòu)
無(wú)需總是在每條記錄中寫(xiě)入所有字段
良好的復(fù)雜類型支持
適合OLTP
缺點(diǎn)
交易支持不佳
不良的分析支持
困難/昂貴的縮放
示例:MongoDB
3.內(nèi)存數(shù)據(jù)庫(kù)
這種類型的數(shù)據(jù)庫(kù)可以提供實(shí)時(shí)響應(yīng),以選擇和插入特定記錄。它們中的大多數(shù)主要將數(shù)據(jù)存儲(chǔ)到RAM中,但在某些情況下還可以在HDD或SSD上提供持久性存儲(chǔ)。這些數(shù)據(jù)庫(kù)中的大多數(shù)都使用鍵/值記錄進(jìn)行操作,因此值可以調(diào)用面向文檔的格式。但是某些數(shù)據(jù)庫(kù)還使用列進(jìn)行操作,并允許在同一表中進(jìn)行二級(jí)索引。使用RAM可以快速處理數(shù)據(jù),但使其更加不穩(wěn)定和昂貴。
好處
快速寫(xiě)作
快速閱讀
缺點(diǎn)
可靠性差
昂貴的縮放
示例:Redis,Tarantool,Apache Ignite
4.寬列數(shù)據(jù)庫(kù)
這些數(shù)據(jù)庫(kù)將數(shù)據(jù)存儲(chǔ)為HDD或SSD上的鍵/值記錄。這些解決方案旨在充分?jǐn)U展,以管理分布式系統(tǒng)中數(shù)千個(gè)商用服務(wù)器中的PB數(shù)據(jù)。它們代表SSTable體系結(jié)構(gòu)。該體系結(jié)構(gòu)設(shè)計(jì)用于兩個(gè)用例:按鍵快速訪問(wèn)和快速,高可用性的編寫(xiě)。
好處
逐行快速書(shū)寫(xiě)
快速讀取按鍵
良好的可擴(kuò)展性
高可用性
缺點(diǎn)
鍵/值格式
沒(méi)有分析支持
示例:Cassandra,HBase
5.柱狀數(shù)據(jù)庫(kù)
有時(shí)我們需要快速訪問(wèn)數(shù)據(jù),而不是使用特定的鍵,而是使用特定的列。在這種情況下,我們最好避免逐行插入,而轉(zhuǎn)為批量寫(xiě)入。批處理插入允許列式數(shù)據(jù)庫(kù)準(zhǔn)備數(shù)據(jù)以供列快速讀取。
好處
按列快速閱讀
良好的分析支持
良好的可擴(kuò)展性
缺點(diǎn)
僅適用于批量插入
示例:Vertica,Clickhouse
6.搜索引擎
如果我們想通過(guò)任何值甚至是列中的任何單詞使用過(guò)濾器訪問(wèn)數(shù)據(jù),我們都應(yīng)該記住搜索引擎。這些數(shù)據(jù)庫(kù)對(duì)列中的每個(gè)單詞進(jìn)行索引,并允許全文搜索。它們非常適合存儲(chǔ)和分析日志或較大的文本值。
好處
一字快速訪問(wèn)
良好的可擴(kuò)展性
缺點(diǎn)
僅適用于批量插入
不良的分析支持
示例:ElasticSearch,Apache Solr
7.圖形數(shù)據(jù)庫(kù)
對(duì)于某些用例,存在圖數(shù)據(jù)結(jié)構(gòu)。我們可以在圖形數(shù)據(jù)庫(kù)中找到它們的實(shí)現(xiàn)。如果您的任務(wù)需要使用圖形,則可以使用專門(mén)設(shè)計(jì)的數(shù)據(jù)庫(kù)來(lái)滿足您的需求。
好處
圖形數(shù)據(jù)結(jié)構(gòu)
實(shí)體之間的可管理關(guān)系
靈活的結(jié)構(gòu)
缺點(diǎn)
特殊查詢語(yǔ)言
難以擴(kuò)展
示例: Neo4j
關(guān)于如何選擇數(shù)據(jù)庫(kù),上述推薦了7款使用比較廣泛的數(shù)據(jù)庫(kù)。至于到底如何選擇,其實(shí)所有類型的數(shù)據(jù)庫(kù)都可以完成所有任務(wù)。問(wèn)題是它會(huì)多么昂貴和如何優(yōu)化。選擇您慣用的工具可以縮短產(chǎn)品上市時(shí)間,但同時(shí)也會(huì)花費(fèi)大量金錢(qián)維護(hù)和擴(kuò)展您的硬件,而這可能會(huì)導(dǎo)致效率低下。始終嘗試按照其使用方式使用數(shù)據(jù)庫(kù)。也許,就能找到適合所需求的解決方案。想了解更多數(shù)據(jù)庫(kù)的信息,請(qǐng)繼續(xù)關(guān)注中培偉業(yè)。