在cassandra中的select查询中使用OR

时间:2015-03-02 06:18:34

标签: cassandra unique-constraint

我想为我的数据设置uniqueness,因此我需要在OR子句中添加WHERE子句。

ex:select * from table where id =123 OR name ='abs'

其中id是分区键,名称是群集键。

所以在上面我希望我得到数据,如果我的id是123或我的名字是abs。

Cassandra是否有可能实现这一目标。

1 个答案:

答案 0 :(得分:1)

这不是你可以用cassandra做的事情,但你可以遵循一些模式来实现这一目标。

这不起作用的主要原因是,因为' name'不是分区键,它需要完整的数据扫描才能找到名称为' abs'的行。

您可以通过执行以下操作来进行两次查询:

select * from table where id=123;
select * from table where name='abs' ALLOW FILTERING;

但我不建议在主应用程序路径中使用ALLOW FILTERING。您也可以添加一个索引,但我也不建议这样做,因为假设名称是唯一的,名称将具有高基数。 cassandra 3.0中的全球索引支持可能有助于(CASSANDRA-6477)。

我认为更好的方法是考虑调整或添加数据模型。

例如,由于您试图在名称上强制执行唯一性,为什么不将其作为主键? id对你有什么意义吗?我认为在两个单独的列上强制执行唯一性是一种不常见的要求。通常,主键/唯一性约束包括单个列或一起使用的列的组合,而不是唯一的。

您可以考虑的另一件事是声明第二个表格&table;来自' 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';

这样做相对便宜,性能也会很好。唯一的代价是您现在正在复制数据,但这实际上是索引在关系数据库中执行的操作,将索引列和包含的列存储在单独的位置。