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中的主键是唯一的吗?的主要内容,如果未能解决你的问题,请参考以下文章