我想使我的数据具有唯一性,因此我需要在 WHERE
子句中添加 OR
子句。
例如:从表中选择*,其中 id =123 OR name ='abs'
其中 id 是分区键,name 是集群键。
所以在上面我希望如果我的 id 是 123 或我的名字是 abs ,我就能获取数据。
Cassandra 是否有可能实现这一目标。
最佳答案
这不是你可以用 cassandra 做的事情,但是你可以遵循一些模式来实现这一点。
这不起作用的主要原因是,由于“name”不是分区键,因此需要完整的数据扫描才能查找名称为“abs”的行。
您可以通过执行以下操作来进行两个查询:
select * from table where id=123;
select * from table where name='abs' ALLOW FILTERING;
但我不建议在主应用程序路径中使用“允许过滤”。您还可以添加索引,但我也不建议这样做,因为假设名称是唯一的,名称将具有高基数。 cassandra 3.0 中的全局索引支持可能会有所帮助 ( CASSANDRA-6477 )。
我认为更好的途径是考虑调整或添加到您的数据模型。
例如,既然您试图强制“名称”的唯一性,为什么不将其设为主键呢? id 对你来说有什么意义吗?我认为在两个单独的列上强制执行唯一性是一个不常见的要求。通常,主键/唯一性约束由单个列或一起使用的列组合(但不限于此)组成。
您可以考虑的另一件事是声明第二个表“table_by_name”,它充当将名称映射到 id 的索引,使用以下架构:
create table table_by_name (
id int,
name text,
primary key (name, id)
);
然后,您需要将数据更改维护到两个表中。但是,您现在可以进行两个单独的查询来确定记录是否已存在:
select * from table where id=123;
select * from table_by_name where name='abs';
这样做的成本相对较低,而且性能也很好。唯一的成本是您现在正在复制数据,但这实际上是索引在关系数据库中所做的事情,将索引列和包含的列存储在单独的位置。
关于cassandra - 在 cassandra 中的选择查询中使用 OR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28803719/