新聞中心
Cassandra是一個混合型的非關(guān)系型數(shù)據(jù)庫,是一個網(wǎng)絡(luò)社交云計算方面理想的數(shù)據(jù)庫。Cassandra的模型和查詢方式與RDBMS有很多的不同,記住這些差異非常重要。本文我們主要對Cassandra和RDBMS的設(shè)計差別進(jìn)行全面的比較,接下來就讓我們來一起了解一下吧。

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、做網(wǎng)站、沈河網(wǎng)絡(luò)推廣、小程序開發(fā)、沈河網(wǎng)絡(luò)營銷、沈河企業(yè)策劃、沈河品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供沈河建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
沒有查詢語言
SQL是關(guān)系型數(shù)據(jù)庫的標(biāo)準(zhǔn)查詢語言,Cassandra卻沒有查詢語言。不過Cassandra確實(shí)也有自己的RPC序列化機(jī)制,Thrift。通過Thrift API,用戶可以訪問其中的數(shù)據(jù)。
沒有引用完整性
Cassandra沒有引用完整性的概念,因而沒有join的概念。在關(guān)系型數(shù)據(jù)庫中,你可以在一個表中指定一個外部鍵值, 以此引用另一個表中記錄的主鍵。但是,Cassandra并沒有提供這個功能。存儲其他表中的相關(guān)ID是一個通用需求,這仍然是被支持的,但Cassandra里沒有級聯(lián)刪除這樣的概念。
第二索引
第二索引確實(shí)是一個有用的功能,比如你需要找到具有某個屬性的酒店的唯一ID,在關(guān)系型數(shù)據(jù)庫里,可能這么查詢:
SELECT hotelID FROM Hotel WHERE name = 'Clarion Midtown';
當(dāng)你知道酒店的名字卻不知道ID的時候,肯定想這么查詢這個酒店。關(guān)系型數(shù)據(jù)庫如果接到這個查詢,會進(jìn)行一個全表掃描,檢查每行的name列,查找所需要的名字。如果表很大,這種查詢可能會很慢。對這種情況,關(guān)系型數(shù)據(jù)庫的解決方案就是為這列建一個索引,相當(dāng)于這部分?jǐn)?shù)據(jù)的一個副本,來幫助更快地檢索數(shù)據(jù)。因?yàn)镠otelID已經(jīng)是一個主鍵約束了,主鍵會自動進(jìn)行索引,也就是主索引,所以,對name列建立的索引自然就是第二索引,目前Cassandra仍然不支持第二索引。
要在Cassandra中做到同樣的事情,需要創(chuàng)建另一個列族來存儲查詢信息。你可以創(chuàng)建一個列族來存儲酒店名,并將它們映射到酒店的ID。第二列族實(shí)際上起到一個顯式的第二索引的作用。
第二索引目前正在被加入到Cassandra 0.7之中來,允許為列值建立索引。所以,如果你希望找到所有居住在指定城市的用戶,第二索引的支持將會讓你不必費(fèi)力手工建立第二索引列族了。
排序成為一種設(shè)計決策
在RDBMS中,可以在查詢中使用ORDER BY來輕松改變返回記錄的順序。默認(rèn)的排序方法確實(shí)是不可配置的;默認(rèn)情況下,記錄按照它們寫入的順序被讀出。如果希望改變順序,只要改變查詢語句即可,而且可以對任意一組列進(jìn)行排序。但在Cassandra之中,排序就不同了,它變成了一個設(shè)計決策。列族的定義中包含一個CompareWith配置元素,這個配置指定了行在讀出的時候按照什么方式排序,它在查詢的時候是無法重新配置的。
RDBMS限制你只能基于存儲在列中的數(shù)據(jù)類型來進(jìn)行排序,但Cassandra存儲的數(shù)據(jù)是字節(jié)數(shù)組,所以這種用指定數(shù)據(jù)類型排序的方法是行不通的。不過,你能做的是把列當(dāng)作幾種可排序的類型之一(ASCII、LONG、integer、TimestampUUID、字典排序等)。如果需要,你還可以使用自己實(shí)現(xiàn)的比較器來進(jìn)行排序。此外,Cassandra里沒有SQL里的ORDER BY和GROUP BY語句。
反范式化
在關(guān)系型數(shù)據(jù)庫設(shè)計中,我們經(jīng)常強(qiáng)調(diào)范式化的重要性。但是當(dāng)使用Cassandra時,這就不是一個優(yōu)點(diǎn)了,因?yàn)橹挥挟?dāng)數(shù)據(jù)模型是反范式化的時候,它的性能才是***的。實(shí)際上,很多公司最終都會將關(guān)系型數(shù)據(jù)庫反范式化,這主要有兩個原因。其一是性能原因,當(dāng)他們在其多年積累的海量有價值的數(shù)據(jù)上進(jìn)行大量的join操作的時候,無法得到所需的性能,于是就按照已知的查詢內(nèi)容來反范式化數(shù)據(jù)庫以優(yōu)化查詢。這種方法最終可以工作,但和關(guān)系型數(shù)據(jù)庫的設(shè)計初衷相悖,最終引發(fā)的問題就是,在這種條件下,使用關(guān)系型數(shù)據(jù)庫是否還是***手段。
關(guān)系型數(shù)據(jù)庫進(jìn)行反范式化的第二個原因是業(yè)務(wù)文檔結(jié)構(gòu)有時需要留存。也就是說,你有一個外圍表,引用了很多的外部表,表的數(shù)據(jù)可能會隨時間發(fā)生變化,但你也需要以快照形式保存外圍文檔的歷史。常見的一個例子是收款信息。你已經(jīng)有客戶和產(chǎn)品表了,而且認(rèn)為可以在收款信息里引用這些表。但是實(shí)際不應(yīng)該這么做,因?yàn)榭蛻艉蛢r格信息都可能發(fā)生變化,那時你就會丟失收款信息的完整性了,因?yàn)檫@些表的變動似乎在收款時也發(fā)生了,這可能會影響到審計、報告,甚至是違法的,還可能引發(fā)其他問題。
在關(guān)系型數(shù)據(jù)庫里, 反范式化會破壞Codd的范式, 我們需要盡力避免。但在Cassandra中,反范式化卻正好合乎規(guī)則。它在數(shù)據(jù)模型很簡單時并不必要,但也不需要害怕它。
重點(diǎn)在于,首先對數(shù)據(jù)建模、然后再寫查詢的方法不再適用了。Cassandra中,應(yīng)該先定義好查詢,并圍繞查詢來組織數(shù)據(jù)。考慮一下應(yīng)用使用的最基本的查詢路徑,之后根據(jù)查詢路徑來構(gòu)建所需要的列族就可以了。
批評者們認(rèn)為這是個非常嚴(yán)重的問題。不過在設(shè)計數(shù)據(jù)庫的時候能夠考慮應(yīng)用如何查詢也并非沒有道理,實(shí)際上,一般在關(guān)系型數(shù)據(jù)庫里也是這么做的。如果不能正確預(yù)期查詢方式,那么不論是在Cassandra里還是在關(guān)系型數(shù)據(jù)庫里,都會遇到問題。當(dāng)然,查詢方式可能會隨著時間推移而改變,那么就不得不更新數(shù)據(jù)了。不過這和在關(guān)系型數(shù)據(jù)庫里定義表時犯錯或需要新的附加表也沒什么區(qū)別。
關(guān)于Cassandra與RDBMS的比較就介紹到這里了,希望本次的介紹能夠給您帶來一些收獲!
當(dāng)前標(biāo)題:全面比較非關(guān)系型數(shù)據(jù)庫Cassandra與RDBMS的設(shè)計差別
網(wǎng)頁鏈接:http://fisionsoft.com.cn/article/dpdosod.html


咨詢
建站咨詢
