十大Linux操作系統(tǒng)
摘要:本文通過(guò)一個(gè)簡(jiǎn)單的實(shí)例詳細(xì)介紹了Cassandra數(shù)據(jù)建模的五個(gè)步驟。以下是譯文。
我們最近在Instaclustr發(fā)表了一篇有關(guān)在Cassandra中經(jīng)常出現(xiàn)的數(shù)據(jù)建模錯(cuò)誤的文章。這篇文章非常受歡迎,并促使我思考如何設(shè)計(jì)出高質(zhì)量的Cassandra數(shù)據(jù)模型,以避免在設(shè)計(jì)的過(guò)程中掉入陷阱。
在互聯(lián)網(wǎng)上,你可以找到很多有關(guān)適配數(shù)據(jù)模型設(shè)計(jì)規(guī)則和設(shè)計(jì)模式的優(yōu)秀文章,例如:Apache Cassandra數(shù)據(jù)建模指南和數(shù)據(jù)建模優(yōu)秀實(shí)踐 。
然而,我們并沒(méi)有一個(gè)詳細(xì)的操作步驟來(lái)指導(dǎo)你對(duì)數(shù)據(jù)進(jìn)行分析,并適配相應(yīng)的規(guī)則和模式。但這份白皮書(shū)正嘗試著填補(bǔ)這方面的空白。
第一階段:了解數(shù)據(jù)這個(gè)階段有兩個(gè)步驟,這兩個(gè)步驟都是為了更好地理解你正在建模的數(shù)據(jù)和所需的訪問(wèn)模式。
定義數(shù)據(jù)域
第一步是深入理解數(shù)據(jù)域。作為一個(gè)非常熟悉關(guān)系數(shù)據(jù)建模的人,我傾向于通過(guò)繪制ER圖來(lái)理解這些實(shí)體、主鍵和互相之間的關(guān)系。但是,如果你熟悉另一種標(biāo)記法,你也可以用一下試試。你需要在邏輯層面理解以下關(guān)鍵點(diǎn):
數(shù)據(jù)模型中的實(shí)體(或?qū)ο螅┦鞘裁矗?/p>
實(shí)體的主要關(guān)鍵屬性是什么?
實(shí)體之間有哪些關(guān)系(即從一個(gè)到另一個(gè)的引用)?
關(guān)系的相對(duì)基數(shù)是多少(例如,假設(shè)存在一對(duì)多的關(guān)系,那么平均是1對(duì)10,還是1對(duì)10000)?
定義所需的訪問(wèn)模式
下一步,弄清楚你自己需要如何訪問(wèn)數(shù)據(jù):
列出需要訪問(wèn)數(shù)據(jù)的路徑,例如:
以客戶ID為索引,在某個(gè)日期范圍內(nèi)搜索交易記錄,然后從搜索結(jié)果中搜索特定交易的詳細(xì)信息。按某個(gè)特定的服務(wù)器和度量標(biāo)準(zhǔn)搜索,檢索x度量值,按年齡升序排列。
按某個(gè)特定的服務(wù)器和度量檢索,從特定時(shí)間點(diǎn)開(kāi)始檢索x度量值。
對(duì)于給定的傳感器,檢索給定日期的多個(gè)度量的所有讀數(shù)。
對(duì)于給定的傳感器,檢索當(dāng)前值。
請(qǐng)記住,對(duì)記錄的任何更新操作都是一個(gè)訪問(wèn)路徑,都需要仔細(xì)考慮。
從性能的角度來(lái)確定哪些訪問(wèn)最關(guān)鍵。是否有一些訪問(wèn)需要盡可能快的速度,而其他一些訪問(wèn)則需要花一定的時(shí)間進(jìn)行多次讀取或在一定范圍內(nèi)進(jìn)行檢索?
請(qǐng)記住,在這個(gè)階段,你需要非常全面地了解如何訪問(wèn)數(shù)據(jù),在Cassandra的性能、可靠性和可伸縮性之間做出權(quán)衡。
第二階段:了解實(shí)體這個(gè)階段有兩個(gè)具體的步驟,旨在了解與數(shù)據(jù)相關(guān)的主要和次要實(shí)體。
確定主要訪問(wèn)實(shí)體
現(xiàn)在,我們開(kāi)始從分析數(shù)據(jù)域和應(yīng)用需求轉(zhuǎn)為開(kāi)始設(shè)計(jì)數(shù)據(jù)模型了。在進(jìn)入這個(gè)階段之前,你需要把上面兩個(gè)步驟的工作做得扎實(shí)一點(diǎn)。
這一階段主要的想法是根據(jù)你所使用的訪問(wèn)模式將數(shù)據(jù)去規(guī)范化到盡可能少的表中。對(duì)于每一次按鍵進(jìn)行的查詢,需要有一張表來(lái)滿足查詢需求。我創(chuàng)造了一個(gè)術(shù)語(yǔ)“主要訪問(wèn)實(shí)體”來(lái)描述用于查詢的實(shí)體(例如,按客戶ID進(jìn)行的查找將使用客戶表作為主要訪問(wèn)實(shí)體,按服務(wù)器和度量名稱的查找將使用服務(wù)器-度量實(shí)體作為主要訪問(wèn)實(shí)體)。
主要訪問(wèn)實(shí)體定義了去規(guī)范化結(jié)果表的分區(qū)級(jí)別(即表會(huì)為每個(gè)主要訪問(wèn)實(shí)體的實(shí)例提供一個(gè)分區(qū))。
你可以選擇使用二級(jí)索引來(lái)滿足一些訪問(wèn)模式,而不是使用不同的主要訪問(wèn)實(shí)體來(lái)實(shí)現(xiàn)數(shù)據(jù)復(fù)制。請(qǐng)記住,包含在輔助索引中的列應(yīng)比被索引的表的基數(shù)更低,并且你要對(duì)索引值的更新頻率了如指掌。
對(duì)于上面舉的訪問(wèn)模式的例子,我們將定義以下主要訪問(wèn)實(shí)體:
客戶和交易(從客戶實(shí)體獲取交易清單,然后從交易實(shí)體查找交易詳情)
服務(wù)器-度量
傳感器
傳感器
分配次要實(shí)體
下一步是尋找一個(gè)地方用來(lái)存儲(chǔ)那些沒(méi)有被選為主要訪問(wèn)實(shí)體的實(shí)體數(shù)據(jù)(這些實(shí)體被稱為次要實(shí)體)。你可以這樣做:
通過(guò)從一對(duì)多關(guān)系的父級(jí)次要實(shí)體獲取數(shù)據(jù)并在主要訪問(wèn)實(shí)體級(jí)別存儲(chǔ)它的多個(gè)副本(例如,將客戶的電話號(hào)碼存儲(chǔ)在客戶的訂單記錄中)。
通過(guò)從一對(duì)多關(guān)系的子次要實(shí)體獲取數(shù)據(jù)并通過(guò)使用聚集鍵或通過(guò)使用多值類型(列表和映射)將其存儲(chǔ)在主要訪問(wèn)實(shí)體級(jí)別上(例如,將記錄項(xiàng)列表添加到交易表中)。
對(duì)于一些次要實(shí)體,只有一個(gè)相關(guān)的主要訪問(wèn)實(shí)體,所以不需要選擇在哪個(gè)方向推入數(shù)據(jù)。對(duì)于其他實(shí)體,你需要選擇將數(shù)據(jù)推入哪些主要訪問(wèn)實(shí)體。
為了獲得最佳的讀取性能,需要將數(shù)據(jù)副本推送到用作次要實(shí)體中數(shù)據(jù)訪問(wèn)路徑的每個(gè)主要訪問(wèn)實(shí)體中。