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