cassandra ::我可以创建一个没有主键的表吗?

时间:2016-02-03 05:44:15

标签: cassandra cql cqlsh thrift-protocol nosql

现在我正在学习 Cassandra ,所以我得到了一张没有主键的表格。但它有一些索引。

所以这是我的疑问,我可以创建一个没有主键的表。?

CREATE TABLE subscription (subscriberid varchar,productid varchar,panaccessproductid varchar,operatorproductid varchar,price float,fallback varchar,paymenttype varchar,operatorid varchar,subscriptiontype varchar,expiry timestamp,subscriptionstatus varchar,created timestamp);

没有主键,subscriberid,productid,operatorid和subscriptiontype是索引。这可能吗?

来自文档

  

主键 ::   主键标识数据存储的位置和顺序。主键是在创建表时定义的   时间不能改变。如果必须更改主键,则会创建一个新的表模式   数据被写入新表。 Cassandra是一个分区行存储,是主键的一个组件,   分区键,标识哪个节点将保存特定的表行。   主键至少必须包含分区键。复合分区键可以拆分   数据集,以便相关数据存储在不同的分区上。复合主键包括群集   用于对分区上的数据进行排序的列。   表格主键的定义在Cassandra中至关重要。仔细模拟表中数据的方式   在选择哪些列将定义主键之前插入和检索。的大小   分区,分区内数据的顺序,分区之间的分区分布   cluster - 所有这些注意事项决定了为表选择最佳主键。

3 个答案:

答案 0 :(得分:4)

简单答案为否,主键是强制性的

答案 1 :(得分:2)

Cassandra不是关系数据库。以您希望使用索引的方式使用索引在Cassandra中不能很好地工作。这是真的主要原因是Cassandra是针对一个集群中有数十,数百或数千台服务器的用例而设计的 - 它使用主键的第一部分(分区键)来确定哪些服务器拥有该服务器数据。 Cassandra的二级索引(您提到要使用)是节点本地的 - 要使用它们,Cassandra必须向群集中的每个服务器询问查询,将查询的影响乘以群集中的每个节点

因此,不是在subscriberid,productid,operatorid和subscriptiontype上创建包含索引的表,而是创建4个表,每个索引一个,其中分区键是subscriberid,productid,operatorid或subscriptiontype。当您查询时,cassandra将确切知道哪个服务器拥有该数据,并保存询问群集的其余部分。

是的,这确实复制了大量数据 - 这称为非规范化,在Cassandra中很常见。

在将来的版本(3.4及更高版本)中,您将能够使用" SASI"这是一种新形式的Cassandra索引,可以显着帮助您的用例,并且需要更少的非规范化。

答案 2 :(得分:2)

您无法在没有主键的情况下在Cassandra中创建表格。但是,如果您想保存数据,还可以在表格中添加一个额外的列(请说" pk")数据类型UUID。

示例:

  

CREATE TABLE订阅(pk uuid PRIMARY KEY,subscriberid varchar,productid varchar,panaccessproductid varchar,operatorproductid varchar,price float,fallback varchar,paymenttype varchar,operatorid varchar,subscriptiontype varchar,expiry timestamp,subscriptionstatus varchar,created timestamp); < / p>

并可以插入如下数据:

  

INSERT INTO订阅(pk,subscriberid,...)VALUES(uuid(),&#39; S123&#39;,...);