【问题标题】:Primary key in cassandra is unique?cassandra中的主键是唯一的吗?
【发布时间】:2014-03-12 19:47:43
【问题描述】:

这可能有点蹩脚,但在 cassandra 中,主键是唯一的吗? 例如下表:

CREATE TABLE users (
  name text,
  surname text,
  age int,
  adress text,
  PRIMARY KEY(name, surname)
);

那么,我的数据库中是否有可能在我的数据库中有 2 个同名同姓但年龄不同的人?这意味着相同的主键..

【问题讨论】:

    标签: cassandra primary-key create-table


    【解决方案1】:

    是的,主键必须是唯一的。否则,当您使用重复键进行查询时,将无法知道要返回哪一行。

    在您的情况下,您可以有 2 行具有相同的名称或具有相同的姓氏,但不能两者兼而有之。

    【讨论】:

    • 好吧..公平地说,如果有重复,它可以返回两个值:)
    【解决方案2】:

    根据定义,主键必须是唯一的。但这并不意味着你不能实现你的目标。你只需要改变你的方法/术语。

    首先,如果您放宽将姓名+姓氏作为主键的目标,您可以执行以下操作:

    CREATE TABLE users ( name text, surname text, age int, address text, PRIMARY KEY((name, surname),age) );
    insert into users (name,surname,age,address) values ('name1','surname1',10,'address1');
    insert into users (name,surname,age,address) values ('name1','surname1',30,'address2');
    select * from users where name='name1' and surname='surname1';
    
     name  | surname  | age | address
    -------+----------+-----+----------
     name1 | surname1 |  10 | address1
     name1 | surname1 |  30 | address2
    

    另一方面,如果您想确保地址也是共享的,那么您可能只想在用户记录中存储一组年龄。这可以通过以下方式实现:

    CREATE TABLE users2 ( name text, surname text, age set<int>, address text, PRIMARY KEY(name, surname) );
    insert into users2 (name,surname,age,address) values ('name1','surname1',{10,30},'address2');
    select * from users2 where name='name1' and surname='surname1';
    
     name  | surname  | address  | age
    -------+----------+----------+----------
     name1 | surname1 | address2 | {10, 30}
    

    所以它回到了你真正需要完成的事情。希望上面的例子能给你一些想法。

    【讨论】:

    • PRIMARY KEY((name, surname),age)PRIMARY KEY(name, surname ,age) 有什么区别
    • @PrakashPandey 这些是Composite keys。如提供的链接所述:复合分区键是由多个列组成的分区键。您使用一组额外的括号将组成复合分区键的列括起来。主键定义内但嵌套括号外的列是聚簇列。这些列在分区内形成逻辑集以方便检索。
    【解决方案3】:

    主键是唯一的。使用您的数据模型,每个(姓名、姓氏)组合只能有一个年龄。

    【讨论】:

      【解决方案4】:

      是的,正如上面 cmets 所述,您可以使用包含姓名、姓氏和年龄的复合键来实现您的目标,但这仍然不能解决问题。相反,您可以考虑添加一个新列 userID 并将其作为主键。因此,即使在姓名、姓氏和年龄重复的情况下,您也不必重新访问您的数据模型。

      CREATE TABLE users (
        userId int,
        name text,
        surname text,
        age int,
        adress text,
        PRIMARY KEY(userid)
      );
      

      【讨论】:

        【解决方案5】:

        我会特别声明分区键应该是唯一的。我无法在一个地方得到它,而是从以下语句中得到它。

        • Cassandra 需要所有分区键列才能进行计算 将允许它定位包含的节点的哈希 分区。

        • 分区键在 Apache Cassandra 之外有特殊用途 显示数据库中记录的唯一性..

        • 请注意,如果您插入相同的内容,不会有任何错误 一次又一次的分区键,因为没有约束检查。

        • 您将对其运行相等搜索的查询应位于分区中 键。

        参考文献

        https://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

        how Cassandra chooses the coordinator node and the replication nodes?

        Insert query replaces rows having same data field in Cassandra clustering column

        【讨论】:

        • 抱歉,这是不正确的 - 分区键不需要是唯一的 - 如果你有 uniq 分区键,那么你有“瘦”分区,只包含一行。如果你有非唯一的分区键,那么你需要有集群列,所以它们形成一个唯一的主键。我见过客户只有一个分区,里面有数百万行(由于数据模型错误)
        • 谢谢,这有点令人困惑。但不是一个节点处理一系列令牌,因此一组唯一分区映射到一个节点并因此处理这个。也请浏览我引用最多的链接。我做了这个测试并检查了一段时间,所以不记得确切
        • 问题是关于标识数据库中单个行的主键。用于计算令牌和选择节点以保留数据的分区键。单个分区可能包含许多行,每行都由分区内的一组集群键标识。
        猜你喜欢
        • 1970-01-01
        • 2020-01-16
        • 1970-01-01
        • 2016-08-17
        • 1970-01-01
        • 2015-09-03
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        相关资源
        最近更新 更多