NoSQL數(shù)據(jù)庫類型說明:列式數(shù)據(jù)庫
為了滿足對(duì)數(shù)據(jù)存儲(chǔ)不斷增長(zhǎng)的需求,以及以最高效的方式容納數(shù)據(jù)多樣性,企業(yè)越來越傾向于選擇非標(biāo)準(zhǔn)數(shù)據(jù)庫類型。多年來,企業(yè)主要使用關(guān)系數(shù)據(jù)庫。然而,隨著需求的變化和存儲(chǔ)價(jià)格的下降,人們開始轉(zhuǎn)而使用非關(guān)系型數(shù)據(jù)庫。
列式數(shù)據(jù)庫符合這種描述。這些是NoSQL數(shù)據(jù)庫,專為高度分析、復(fù)雜查詢?nèi)蝿?wù)而構(gòu)建。與關(guān)系數(shù)據(jù)庫不同,列式數(shù)據(jù)庫按列而不是按行存儲(chǔ)數(shù)據(jù)。這些列被收集以形成子組。
這類數(shù)據(jù)庫的鍵名和列名不是固定的。同一列族或列簇中的列可以具有不同的行數(shù),并且可以容納不同類型的數(shù)據(jù)和名稱。
當(dāng)需要大型數(shù)據(jù)模型時(shí),最常使用這些數(shù)據(jù)庫。它們對(duì)于數(shù)據(jù)倉庫非常有用,或者在需要高性能或處理密集查詢時(shí)非常有用。
列式數(shù)據(jù)庫如何工作
關(guān)系型數(shù)據(jù)庫有固定的模式,它們具有行和列的表。寬列數(shù)據(jù)庫具有相似但不同的架構(gòu)。它們也有行和列。但是,它們不是固定在表中,而是具有動(dòng)態(tài)模式。每列單獨(dú)存儲(chǔ)。
如果存在相似(相關(guān))的列,則將它們關(guān)聯(lián)到列族中,然后將這些列族與其他列族分開存儲(chǔ)。 行鍵是每個(gè)列族的第一列,作為行的標(biāo)識(shí)符。此外,之后的每一列都有一個(gè)列鍵(名稱)。它標(biāo)識(shí)行中的列,從而實(shí)現(xiàn)對(duì)列的查詢。值和時(shí)間戳出現(xiàn)在列鍵之后,說明數(shù)據(jù)何時(shí)被輸入或修改。
與每一行相關(guān)的列數(shù)或其名稱可能會(huì)有所不同。換句話說,并不是一個(gè)列族的每一列都有相同的行數(shù)。事實(shí)上,即使它們可能共享它們的名字,每一列都包含在一行中并且不會(huì)跨越所有行。
接觸過關(guān)系型數(shù)據(jù)庫的人都知道,關(guān)系型數(shù)據(jù)庫的每一列都有相同的行數(shù),只是碰巧有些字段有空值,或者看起來是空的。對(duì)于寬列數(shù)據(jù)庫,這些行不是空的,而是對(duì)于特定列根本不存在。
列族位于鍵空間中。每個(gè)鍵空間都包含一個(gè)完整的 NoSQL 數(shù)據(jù)存儲(chǔ),并且正如模式對(duì)關(guān)系數(shù)據(jù)庫那樣,它具有相似的角色或重要性。然而,由于 NoSQL 數(shù)據(jù)存儲(chǔ)沒有集合結(jié)構(gòu),鍵空間代表無模式數(shù)據(jù)庫,其中包含數(shù)據(jù)存儲(chǔ)設(shè)計(jì)和它自己的屬性集。
當(dāng)前最流行的列式數(shù)據(jù)庫之一是 MariaDB。它是作為 MySQL 的分支而創(chuàng)建,它很強(qiáng)大且可擴(kuò)展,可處理很多不同的目的和大量的查詢。Apache Cassandra是柱狀數(shù)據(jù)庫的另一個(gè)例子,它處理跨多個(gè)服務(wù)器的大量數(shù)據(jù)負(fù)載,使數(shù)據(jù)高度可用。其他數(shù)據(jù)庫還包括專為分析設(shè)計(jì)的 Apache HBase、Hypertable和Druid。這些數(shù)據(jù)庫支持Outbrain、Spotify 和 Facebook等平臺(tái)的某些功能。
列族類型
- 標(biāo)準(zhǔn)列族。這種列族類型類似于表;它包含一個(gè)鍵值對(duì),其中鍵是行鍵,值存儲(chǔ)在列中,使用它們的名稱作為標(biāo)識(shí)符。
- 超級(jí)列族。超級(jí)列代表列數(shù)組。每個(gè)超級(jí)列都有一個(gè)名稱和一個(gè)值,將超級(jí)列映射到幾個(gè)不同的列。相關(guān)的超級(jí)列關(guān)聯(lián)在超級(jí)列族的單行種。與關(guān)系數(shù)據(jù)庫相比,這就像數(shù)據(jù)庫中幾個(gè)不同表。想象一下,你可以查看單行的列和值,這是跨多個(gè)不同表的單個(gè)標(biāo)識(shí)符,并且能夠?qū)⑺鼈內(nèi)看鎯?chǔ)在一個(gè)地方:這就是超級(jí)列族。
列式數(shù)據(jù)庫的優(yōu)勢(shì)
- 可擴(kuò)展性。這是主要優(yōu)勢(shì),這也是企業(yè)使用此類數(shù)據(jù)庫存儲(chǔ)大數(shù)據(jù)的主要原因之一。它能夠根據(jù)數(shù)據(jù)庫的規(guī)模分布在數(shù)百臺(tái)不同的機(jī)器上,支持大規(guī)模并行處理。這意味著它可以使用多個(gè)處理器同時(shí)處理同一組計(jì)算。
- 壓縮。它們不僅具有無限的可擴(kuò)展性,而且還擅長(zhǎng)壓縮數(shù)據(jù),從而節(jié)省存儲(chǔ)空間。
- 反應(yīng)靈敏。加載時(shí)間最短,查詢執(zhí)行速度快,這是因?yàn)樗鼈儽辉O(shè)計(jì)為支持大數(shù)據(jù),并適用于分析。
列式數(shù)據(jù)庫的缺點(diǎn)
- 在線事務(wù)處理。對(duì)于在線事務(wù)處理,這些數(shù)據(jù)庫不是很高效,不如在線分析處理。這意味著它們不太擅長(zhǎng)更新事務(wù),但旨在分析它們。這就是為什么我們看到這些數(shù)據(jù)庫用于保存業(yè)務(wù)分析所需的數(shù)據(jù),而關(guān)系數(shù)據(jù)庫在后端存儲(chǔ)數(shù)據(jù)。
- 增量數(shù)據(jù)加載。如上所述,通常列式數(shù)據(jù)庫用于分析并且可以快速檢索數(shù)據(jù),即使在處理復(fù)雜查詢時(shí)也是如此,因?yàn)閿?shù)據(jù)在列中緊密聯(lián)系。雖然增量數(shù)據(jù)加載并非不可能,但列式數(shù)據(jù)庫并不能以最有效的方式執(zhí)行它們。首先需要掃描列以識(shí)別正確的行,然后進(jìn)一步掃描以定位需要覆蓋的修改數(shù)據(jù)。
- 特定于行的查詢。正如上面提到的缺點(diǎn),這一切都?xì)w結(jié)為同一問題,即為正確的目的使用正確類型的數(shù)據(jù)庫。對(duì)于特定于行的查詢,你會(huì)引入額外的步驟,即掃描列以識(shí)別行,然后定位要檢索的數(shù)據(jù)。訪問分散在多列中的單個(gè)記錄需要很多時(shí)間,而訪問單個(gè)列中的分組記錄會(huì)更快。頻繁的行特定查詢可能會(huì)降低列式數(shù)據(jù)庫的速度,從而導(dǎo)致性能問題,這無疑違背該數(shù)據(jù)庫的設(shè)計(jì)初衷,它是專為幫助快速獲取所需信息而設(shè)計(jì)。
NoSQL數(shù)據(jù)庫主要是為滿足特定目的而設(shè)計(jì),不應(yīng)用作一般類型的存儲(chǔ)。寬列數(shù)據(jù)庫是列式而不是行式,它主要用于存儲(chǔ)和查詢大數(shù)據(jù)。該類型中有很多不同的數(shù)據(jù)庫可用,在尋找最合適的數(shù)據(jù)存儲(chǔ)解決方案時(shí),你應(yīng)該探索它們的功能。