现在我正在学习 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 - 所有这些注意事项决定了为表选择最佳主键。
答案 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;,...);