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