我有node_id,node_name和data的表。我的要求是getByID和getByName。所以我把id和name作为主键。但我有时也需要更新名称。
我知道Cassandra不允许更新主键并在WHERE子句中使用非主键。
我怎样才能做到这一点?
我确实考虑先删除记录,然后再次使用相同的ID和新名称插入。但我读到这会产生墓碑并影响性能。
答案 0 :(得分:0)
仅使用node_id作为主键。要实现getByName,请创建一个物化视图。 materialized views in cassandra
答案 1 :(得分:-1)
create table users_by_id_name(
id int,
createdOn bigint, -- timestamp in millisec
name text,
age int,
primary key (id,name,createdOn)
)WITH CLUSTERING ORDER BY ( name DESC, createdOn DESC);
使用上面的表定义来插入用户。 插入查询 -
insert into users_by_id_name (id,createdOn,name,age) values (1,100,'darthvedar',28);
更新用户,再次使用相同的用户ID和更新的名称以及createdOn值插入行。
insert into users_by_id_name (id,createdOn,name,age) values (1,200,'obi-wan-kenobi',28);
选择用户使用以下查询 -
按用户ID选择 -
select * from users_by_id_name where id=1 limit 1;
按名称选择用户 -
select * from users_by_id_name where name='obi-wan-kenobi' ALLOW FILTERING;
其他方式是在用户名上使用二级索引。想想,用户名不会太频繁地改变,所以二级索引也是一个不错的选择。
评论后编辑 -
如果您经常更新用户名,最好使用两个不同的表。
create table users_by_id(
id int,
name text,
age int,
primary key (id)
);
create table users_by_name(
id int,
name text,
age int,
primary key (name)
);
插入时,使用批处理语句在两个表中插入。
希望这会有所帮助。