cassandra - 在 cassandra 中的选择查询中使用 OR

标签 cassandra unique-constraint

我想使我的数据具有唯一性,因此我需要在 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/

相关文章:

mysql - 数据库设计 : need composite key + foreign key Part 2

sql - 在 PostgreSQL 中更新具有非空和唯一约束的列的特殊情况

cassandra - Cassandra 中的总行数

cassandra - 在 mesos 集群上运行 cassandra

mysql - 如何使用 ruby​​ on Rails 配置 cassandra 以及使用哪个 ORM?

java - 服务中的空 Autowiring Spring Bean(Cassandra 存储库)

PostgreSQL:从 MAX(the_column)+1 处开始一个序列

web2py - web2py的多列唯一约束

java - JPA2 唯一约束 : do I really need to flush?

nosql - 使用 cql 在 cassandra 中将值设置为 null