簡體   English   中英

比較 Cassandra 結構與關系數據庫

[英]Comparing Cassandra structure with Relational Databases

幾天前,我讀到了 NoSQL 的寬列存儲類型和 Apache-Cassandra。

我的理解是 Cassandra 包括:

一個鍵空間(如關系數據庫中的數據庫)並支持許多列族或表(與關系數據庫中的表相同)和無限行。

從 Stackoverflow 標簽:

寬列存儲是一種鍵值數據庫。 它使用表、行和列,但與關系數據庫不同,列的名稱和格式在同一表中的行與行之間可能不同。

在 Cassandra 中,所有行(在表中)都應該有一個行鍵,然后每個行鍵可以有多個列。 我閱讀了關系數據庫和 NoSQL (Cassandra) 在實現和存儲數據方面的差異。

但我不明白結構之間的區別:

想象一下我有一個表(或 Cassandra 中的列族)的場景:

當我執行這樣的查詢(CQL)時:

select * from users;

它給了我你可以看到的結果:

lastname  | age  | city          | email               
----------+------+---------------+----------------------
      Doe |   36 | Beverly Hills | janedoe@email.com       
    Jones |   35 |        Austin | bob@example.com        
    Byrne |   24 |     San Diego | robbyrne@email.com         
    Smith |   46 |    Sacramento | null                    
   Jones2 | null |        Austin | bob@example.com       

因此,我使用以下查詢在關系數據庫 (MS SQL) 中執行上述場景:

select * from [users] 

結果是:

lastname  | age  | city          | email               
----------+------+---------------+----------------------
      Doe |   36 | Beverly Hills | janedoe@email.com       
    Jones |   35 |        Austin | bob@example.com        
    Byrne |   24 |     San Diego | robbyrne@email.com         
    Smith |   46 |    Sacramento | NULL                    
   Jones2 | NULL |        Austin | bob@example.com       

我知道 Cassandra 支持動態列,我可以通過使用 sth 來執行此操作:

ALTER TABLE users ADD website varchar;

但是它在關系模型中可用,例如在 mssql 中,上面的代碼也可以實現。 類似的東西:

ALTER TABLE users ADD website varchar(MAX);

我看到的是第一次選擇和第二次選擇的結果是一樣的。 在 Cassandra 中,他們只提供一個行鍵(姓氏)作為獨立對象,但它與 mssql(和所有關系數據庫)中的唯一字段(如 ID 或文本)相同,我看到 Cassandra 中的列類型是靜態的(在我的示例中varchar )與 Stackoverflow 標簽中描述的不同。

所以我的問題是:

  1. 我對Cassandra的想象有什么誤解嗎?!

  2. 那么兩種結構有什么不同?! 我告訴你結果是一樣的。

  3. 是否有任何特殊場景(JSON 之類)無法在關系數據庫中實現但 Cassandra 支持? (例如,我知道 Cassandra 不支持嵌套列。)

感謝您的閱讀。

我們必須查看更復雜的示例才能看到差異:)

開始:

  • 列族術語在較舊的 Thrift API 中使用
  • 在較新的 CQL API 中,使用術語表

表被定義為“多維列族的二維視圖”。

“寬行”一詞主要與 Thrift API 相關。 在 cql 中它的定義有點不同,但在下面看起來是一樣的。

比較 SQL 和 CQL。 在 SQL 表中是一組行。 在簡單的例子中,它在 CQL 中看起來是一樣的,但事實並非如此。 CQL 表是一組分區,其中每個分區可以是單行(例如,當您沒有集群鍵時)或多行。 包含多行的分區在 Thrift 熱學中名為“寬行”。 要查看它是如何存儲在下面的,請從這里閱讀例如關於復合鍵的部分。

還有更多區別:

  • CQL 可以具有存儲在分區級別的靜態列 - 分區中的每一行似乎都有一個共同的值,但實際上它是存儲在上層的單個值。 它還可以用於建模 1:N 關系
  • 在 CQL 中,您可以擁有集合類型列 - set、list、map
  • 列可以包含用戶定義的類型(您可以將例如address定義為類型,並在許多地方重用該類型),或者集合可以是用戶定義類型的集合
  • 但是 CQL 也不支持 SQL 中可用的 JOIN,並且您必須非常仔細地構造您的表,因為它們必須嚴格面向查詢(在 cassandra 中您不能通過任何列值查詢數據,二級索引也有很多限制)。 人們常說,在關系模型中,您可以清楚地根據數據對表進行建模,而在 cassandra 中,您可以根據查詢進行建模。

我希望我能讓你更清楚一點。 我建議觀看Datastax 核心概念課程中的一些視頻(或閱讀幻燈片),作為對 Cassandra 的可靠介紹。

根據我的經驗,CQL 誤導了很多人。 首先,你永遠不會想做:

SELECT * FROM a_table_here; 

在生產 Cassandra 集群上,因為您在 Coordinator 節點上放置了大量負載以聚合來自所有其他節點的所有數據。 此外,默認情況下,您最多會收到 10000 個“行”。

要了解 Cassandra 如何存儲您的數據,我們需要先確定幾個術語:

有主鍵,在你的情況下是lastname ,它被散列以確定集群中的哪個節點擁有這個范圍,並將它存儲在那里(加上任何副本節點)。

接下來是集群列,我不知道您的示例中是否有任何列,但是您可以像PRIMARY KEY ((lastname),age, city)一樣定義它們。 在該示例中,您首先按年齡聚類,然后按城市聚類,這是有序的。

現在為您的用例提供一個簡單的 Cassandra 高級視圖,它將數據作為 Map 存儲到有序 Multimap:

Doe -> 36:Beverly Hills -> janedoe@email.com

其中“Doe”是主鍵,它告訴您哪些節點具有該行數據。 36:Beverly Hills是 Ordered Clustering Keys(有序多映射鍵的一部分)。 最后 janedoe@email.com 是 Map to a Multimap 的最終值(可能是多個人)。

為了使示例簡單,我遺漏了很多麻煩,為了更深入,我強烈建議閱讀: http : //www.planetcassandra.org/making-the-change-from-thrift-to-cql /

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM