首页 文章

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

提问于
浏览
4

现在我正在学习 Cassandra ,所以我得到了一张没有 primary key 的 table . 但它有一些指数 .

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

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 回答

  • 2

    简单的答案是否定的, primary key is mandatory

  • 2

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

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

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

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

  • 4

    如果没有主键,则无法在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);

    并可以插入如下数据:

    INSERT INTO订阅(pk,subscriberid,...)VALUES(uuid(),'S123',...);

相关问题