Cassandra 我可以创建一个没有primarykey的表吗?

Cassandra 我可以创建一个没有primarykey的表吗?,cassandra,cql,cqlsh,thrift-protocol,nosql,Cassandra,Cql,Cqlsh,Thrift Protocol,Nosql,现在我正在学习卡桑德拉,所以我得到了一个没有主键的表。但是它有一些索引 这就是我的疑问,我能创建一个没有主键的表吗 CREATE TABLE subscription (subscriberid varchar,productid varchar,panaccessproductid varchar,operatorproductid varchar,price float,fallback varchar,paymenttype varchar,operatorid varchar,subsc

现在我正在学习卡桑德拉,所以我得到了一个没有主键的表。但是它有一些索引

这就是我的疑问,我能创建一个没有主键的表吗

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);
没有primarykey,subscriberid、productid、operatorid和SubscribptionType是索引。这可能吗

从文件中

主键: 主键标识数据存储的位置和顺序。主键在表创建时定义 时间是不能改变的。如果必须更改主键,则会创建一个新的表架构,并且 数据将写入新表。Cassandra是一个分区行存储,是主键的一个组件, 分区键标识哪个节点将持有特定的表行。 至少,主键必须由分区键组成。复合分区键可以分割一个分区 数据集,以便相关数据存储在单独的分区上。复合主键包括聚类 对分区上的数据进行排序的列。 在Cassandra中,表主键的定义至关重要。仔细建模表中的数据将如何 在选择将定义主键的列之前插入和检索。大小 分区,分区内数据的顺序,分区在 集群—所有这些考虑因素都决定了表的最佳主键的选择


简单的回答是否定的,主键是必需的Cassandra不是关系数据库。按照预期使用索引的方式使用索引在Cassandra中效果不佳。之所以如此,主要原因是Cassandra是为一个集群中有几十台、数百台或数千台服务器的用例而设计的——它使用主键的第一部分(分区键)来确定哪些服务器拥有该数据。Cassandra的二级索引(您提到要使用的)是节点本地索引——要使用这些索引,Cassandra必须向集群中的每个服务器请求查询,将查询的影响乘以集群中的每个节点

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

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


在未来的版本(3.4及更高版本)中,您将能够使用“SASI”,这是一种新形式的Cassandra索引,可以显著地帮助您的用例,而所需的非规范化要少得多

如果没有主键,您无法在Cassandra中创建表,但是如果您想保存数据,您仍然可以向表中添加一个数据类型为UUID的附加列(比如“pk”)

例如:

创建表订阅(pk uuid主键、subscriberid varchar、productid varchar、panaccessproductid varchar、operatorproductid varchar、价格浮动、回退varchar、paymenttype varchar、operatorid varchar、subscriptiontype varchar、到期时间戳、subscriptionstatus varchar、创建的时间戳)

并可以插入如下数据:

在订阅(pk,subscriberid,…)中插入值(uuid(),'S123',…)


您好,先生,是否可能,主键和索引相同?例如,在“创建表contentaction”(subscriberid varchar、mobileno varchar、contentid varchar、contentname varchar、scenename varchar、scenename varchar、sceneid varchar、体裁varchar、action varchar、screen varchar、created timestamp、主键((内容ID、动作、屏幕、订阅ID、流派、场景ID)、订阅ID、内容ID、已创建)