Cassandra:我能否创建一个没有主键的表?

7

我现在正在学习 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中,表的主键定义非常重要。在选择哪些列定义主键之前,仔细地建模表中的数据将如何插入和检索。 分区大小、分区内数据的顺序、分区在群集节点间的分布——所有这些考虑因素决定了选择表的最佳主键。

3个回答

9
简单回答是不行的,主键是必需的。

4
Cassandra不是关系型数据库。在Cassandra中,使用索引的方式并不能很好地工作。这是因为Cassandra设计用于一个集群有数十个、数百个或数千个服务器的使用场景 - 它使用主键的第一部分(分区键)来确定哪些服务器拥有该数据。Cassandra的二级索引(您想要使用的)是节点本地的-为了使用这些索引,Cassandra必须向集群中的每个服务器请求查询,从而将查询的影响乘以集群中的每个节点。
因此,您不应该创建一个带有subscriberid、productid、operatorid和subscriptiontype索引的表,而是创建4个表,每个表都有一个索引,其中分区键是subscriberid、productid、operatorid或subscriptiontype之一。当您查询时,Cassandra会知道哪个服务器拥有数据,并且避免询问集群中的其他服务器。
是的,这确实会复制大量数据 - 这被称为去规范化,在Cassandra中很常见。
在将来的版本(3.4及更高版本)中,您将能够使用“SASI”,这是Cassandra索引的一种新形式,可以显著帮助您的使用情况,需要较少的去规范化。

先生您好,主键和索引是否可以相同? - Renjith V R
在“CREATE TABLE contentaction(subscriberid varchar,mobileno varchar,contentid varchar,contentname varchar,scenename varchar,sceneid varchar,genre varchar,action varchar,screen varchar,created timestamp,PRIMARY KEY((contentid,action,screen,subscriberid,genre,sceneid),subscriberid,contentid,created));”中,“subscriberid”表示订阅者ID。 - Renjith V R

3
在Cassandra中,如果没有主键,您无法创建表。但是如果您想保存数据,可以向表中添加一个附加列(比如"pk"),并将其数据类型设置为UUID。
例如:
``` CREATE TABLE subscription (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); ```
然后可以像这样插入数据:
``` INSERT INTO subscription(pk, subscriberid,...) VALUES(uuid(), 'S123',...); ```

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接