0

我在我们的用例中使用下表 -

create table test_new (
    employee_id text,
    employee_name text,
    value text,
    last_modified_date timeuuid,
    primary key (employee_id, last_modified_date)
   );

create index employee_name_idx on test_new (employee_name);

在我上面的表中,employee_id 总是从 1 到 32767 是唯一的。所以我们的查询模式是这样的:

  1. 给我任何employee_id的一切?
  2. 给我过去 5 分钟发生的变化的一切?
  3. 给我任何employee_name的一切?

我会将以下数据插入上表 -

insert into test_new (employee_id, employee_name, value, last_modified_date) 
        values ('1', 'e27',  'some_value', now());
insert into test_new (employee_id, employee_name, value, last_modified_date) 
        values ('2', 'e27',  'some_new_value', now());
insert into test_new (employee_id, employee_name, value, last_modified_date) 
        values ('3', 'e28',  'some_new_again_value', now());

我能够执行上述所有查询模式,但仍然存在一个问题。


我的问题是关于避免以下查询的这种特殊情况。如果,不知何故错误地尝试执行下面的查询。如果他们这样做,它将创建另一行,其中employee_id 为 1 和其他字段?如果 Cassandra 数据库中已经存在相同的employee_id,我不希望任何人再次插入它。

insert into test_new (employee_id, employee_name, value, last_modified_date) 
         values ('1', 'e29',  'some_new_value', now());

有什么想法吗?我知道这是一个有争议的情况,因为关于使用 RDBMS 与 Cassandra 的争论

而且在employee_name上创建索引会导致任何问题吗?在我的示例中,相同的employee_name 可以有多个employee_id 但具有不同的值。请记住,它employee_id不会大于32767so,这意味着最大行数将32767在上表中。

我正在运行 Cassandra 1.2.9

4

1 回答 1

1

如果 Cassandra 数据库中已经存在相同的employee_id,我不希望任何人再次插入它

保证Cassandra 提供的唯一方法(“仅在不存在具有相同 PK 的行时插入”)是 Cassandra 2.0 中引入的条件插入/udpates:http://www.datastax.com/dev/blog/lightweight -transactions-in-cassandra-2-0

但请注意,它的性能不是很好。如果您不经常添加新员工,那么它可能正是您想要的,但如果这是一个经常进行的查询并且可能发生争用,那么这可能不会那么好。但是您说您不需要超过 32K 的employee_id 值这一事实表明,添加新员工根本不是真正的频繁查询。

话虽这么说,如果唯一担心的是您不会重复使用两次相同的employee_id,那么C* 中的标准解决方案是只为employee_id 使用uuid,这样您就不必担心冲突。

于 2013-11-15T15:19:10.873 回答