比较Cassandra结构与关系数据库

ᔕIᑎ*_*ᑎᗪI 11 cassandra wide-column-store

几天前,我读到了有关宽列存储类型的NoSql和Apache-Cassandra的全部内容.我的理解是Cassandra包括:

密钥空间(如关系数据库中的数据库)并支持许多列族或表(与关系数据库中的表相同)和无限行.

来自Stackoverflow标签:

宽列存储是一种键值数据库.它使用表,行和列,但与关系数据库不同,列的名称和格式可能因同一个表中的行而异.

在Cassandra中,所有行(在表中)都应该有一个行键,然后每个行键可以有多个列.我读到了关系数据库和NoSql(Cassandra)的实现和存储数据的差异.

但我不明白结构之间的区别:

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

当我执行这样的查询(Cql)时:

Select * from users;
Run Code Online (Sandbox Code Playgroud)

它给你我的结果,你可以看到:

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       
Run Code Online (Sandbox Code Playgroud)

所以我使用打击查询在关系数据库(MsSql)中执行上述场景:

select * from [users] 
Run Code Online (Sandbox Code Playgroud)

结果是:

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              
Run Code Online (Sandbox Code Playgroud)

我知道Cassandra支持动态列,我可以通过使用类似于执行此操作:

ALTER TABLE users ADD website varchar;
Run Code Online (Sandbox Code Playgroud)

但它在关系模型中可用,例如在mssql中也可以实现上述代码.就像:

ALTER TABLE users 
ADD website varchar(MAX) 
Run Code Online (Sandbox Code Playgroud)

我看到的是第一个选择和第二个选择结果是相同的.在Cassandra中,他们只是将一个行键(lastname)作为一个独立的objet,但它与mssql(和所有关系数据库)中的唯一字段(如ID或文本)相同,我看到Cassandra中的列类型是静态的(在我的示例中varchar)与Stackoverflow标记中描述的不同.

所以我的问题是:

  1. 我对卡桑德拉的想象有什么误解吗?!

  2. 那两个结构有什么不同?!我告诉你结果是一样的.

  3. 是否有任何特殊场景(Json喜欢)无法在关系数据库中实现但Cassandra支持?(例如我知道嵌套列在Cassandra中不支持.)

谢谢你的阅读.

mma*_*oka 9

我们必须看一下更复杂的例子来看看差异:)

首先:

  • 列系列术语用于较旧的Thrift API
  • 在较新的CQL API中,使用术语表

表被定义为"多维列族的二维视图".

术语"宽行"主要与Thrift API有关.在cql中,它的定义有点不同,但在下面看起来是一样的.

比较SQL nad CQL.在SQL表中是一组行.在简单的例子中,它在CQL中看起来是相同的,但事实并非如此.CQL表是一组分区,其中每个分区可以只是一行(例如,当您没有聚类键时)或多行.包含多行的分区在Thrift therminology中命名为"wide-row".要查看它是如何存储在下面的,请从此处阅读例如关于复合键的部分.

有更多的差异:

  • CQL可以具有存储在分区级别的静态列 - 看起来分区中的每一行都有一个公共值,但实际上它是存储在上层的单个值.它也可以用于模型1:N关系
  • 在CQL中,您可以拥有集合类型列 - set,list,map
  • 列可以包含用户定义的类型(您可以定义address为类型,并在许多地方重用此类型),或者集合可以是用户定义类型的集合
  • 但是CQL也不支持SQL中可用的JOIN,你必须非常仔细地构建表,因为它们必须严格面向查询(在cassandra中你不能通过任何列值查询数据,二级索引也有很多限制).通常会说,在关系模型中,您可以根据数据清楚地建模表格,而在cassandra中,您可以根据查询进行建模.

我希望我能够让你更清楚一些.我建议从Datastax核心概念课程中观看一些视频(或阅读幻灯片)作为Cassandra的可靠介绍.


fro*_*tor 7

根据我的经验,CQL 误导了很多人。首先,你永远不会想做:

SELECT * FROM a_table_here; 
Run Code Online (Sandbox Code Playgroud)

在生产 Cassandra 集群上,因为您在 Coordinator 节点上放置了大量负载以聚合来自所有其他节点的所有数据。此外,默认情况下,您最多会收到 10000 个“行”。

要了解 Cassandra 如何存储您的数据,我们需要先确定几个术语:

有主键,在你的情况下lastname,它被散列以确定集群中的哪个节点拥有这个范围,它存储在那里(加上任何副本节点)。

接下来是集群列,我不知道您的示例中是否有任何列,但是您将它们定义为PRIMARY KEY ((lastname),age, city). 在该示例中,您首先按年龄聚类,然后按城市聚类,这是有序的。

现在为您的用例提供一个简单的 Cassandra 高级视图,它将数据作为 Map 存储到有序 Multimap:

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

其中“Doe”是主键,它告诉您哪些节点具有该行数据。并且36:Beverly Hills是有序聚类键(有序多映射键的一部分)。最后 janedoe@email.com 是 Map to a Multimap 的最终值(可能是多个人)。

为了使示例简单,我遗漏了很多麻烦,为了更深入,我强烈建议阅读:http : //www.planetcassandra.org/making-the-change-from-thrift-to-cql /