cassandra中的主键是唯一的吗?

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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 分区键,那么你有“瘦”分区,只包含一行。如果你有非唯一的分区键,那么你需要有集群列,所以它们形成一个唯一的主键。我见过客户只有一个分区,里面有数百万行(由于数据模型错误) 谢谢,这有点令人困惑。但不是一个节点处理一系列令牌,因此一组唯一分区映射到一个节点并因此处理这个。也请浏览我引用最多的链接。我做了这个测试并检查了一段时间,所以不记得确切 问题是关于标识数据库中单个行的主键。用于计算令牌和选择节点以保留数据的分区键。单个分区可能包含许多行,每行都由分区内的一组集群键标识。

以上是关于cassandra中的主键是唯一的吗?的主要内容,如果未能解决你的问题,请参考以下文章

cassandra中的主键和索引

做java项目时的主键和外键是啥啊?

mysql的主键是自动增长的,oracle的主键是起啥作用的

请问SQL server 中的主键和外键的作用

数据库中的主键、关键字、索引

数据库中,主键是不能重复,唯一的,请问外键是否也不能重复的??