【问题标题】:cassandra:: can i create a table without a primarykey?cassandra:: 我可以创建一个没有主键的表吗?
【发布时间】:2016-05-12 04:42:19
【问题描述】:

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

【问题讨论】:

    标签: cassandra cql cqlsh thrift-protocol nosql


    【解决方案1】:

    简单的回答是否定的,主键是强制性的

    【讨论】:

      【解决方案2】:

      Cassandra 不是关系数据库。以您打算使用索引的方式使用索引在 Cassandra 中效果不佳。这是正确的主要原因是 Cassandra 是为集群中拥有数十、数百或数千台服务器的用例而设计的 - 它使用主键的第一部分(分区键)来确定哪些服务器拥有它数据。 Cassandra 的二级索引(您提到想要使用)是节点本地的 - 要使用它们,Cassandra 必须向集群中的每个服务器询问查询,从而将查询的影响乘以集群中的每个节点。

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

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

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

      【讨论】:

      • 你好先生,有可能吗,主键和索引是一样的?
      • 例如,subscriberid in "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));"
      【解决方案3】:

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

      例子:

      CREATE TABLE 订阅(pk uuid PRIMARY KEY、subscriberid varchar、productid varchar、panaccessproductid varchar、operatorproductid varchar、价格浮动、fallback varchar、paymenttype varchar、operatorid varchar、subscriptiontype varchar、到期时间戳、subscriptionstatus varchar、创建时间戳);

      并且可以插入如下数据:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        • 1970-01-01
        • 1970-01-01
        • 2018-06-23
        • 1970-01-01
        • 2011-01-31
        • 2018-05-17
        相关资源
        最近更新 更多