Cassandra,partition/primary 键:分区和约束
Cassandra, partition/primary key: partitioning and constraint
我正在尝试在 Cassandra 中设计一些列族,但我对 primary/partition 键有一些疑问。
我想要的是:
- 在集群周围均匀分布数据
- 尽量减少读取的分区数
我知道这些目标可以通过选择合适的 partition/primary 键来实现,但是假设选择的 partition/primary 键允许列族中的无效数据,您会怎么做?
假设我有以下列系列:
CREATE TABLE group (
groupname text,
username text,
PRIMARY KEY (groupname, username))
假设一个用户名必须只属于一个组,有了这个主键我可以实现(有一些假设)以前的目标,但没有办法避免一个用户名被放置在多个组中。
我可以简单地假设列族中的内容吗,或者有办法避免插入无效数据吗?
声明一个以用户名作为主键的 table 将确保只存在一个用户名到组的关系:
CREATE TABLE group (username text, groupname text, PRIMARY KEY (username));
使用 lightweight transactions 您可以阻止对用户组的更新:
INSERT INTO group (username, groupname) VALUES ('joe', 'wheel') IF NOT EXISTS;
如果要按组查询,创建物化视图:
CREATE MATERIALIZED VIEW usersbygroup AS
SELECT groupname, username FROM group
PRIMARY KEY (groupname, username);
我正在尝试在 Cassandra 中设计一些列族,但我对 primary/partition 键有一些疑问。
我想要的是:
- 在集群周围均匀分布数据
- 尽量减少读取的分区数
我知道这些目标可以通过选择合适的 partition/primary 键来实现,但是假设选择的 partition/primary 键允许列族中的无效数据,您会怎么做?
假设我有以下列系列:
CREATE TABLE group (
groupname text,
username text,
PRIMARY KEY (groupname, username))
假设一个用户名必须只属于一个组,有了这个主键我可以实现(有一些假设)以前的目标,但没有办法避免一个用户名被放置在多个组中。
我可以简单地假设列族中的内容吗,或者有办法避免插入无效数据吗?
声明一个以用户名作为主键的 table 将确保只存在一个用户名到组的关系:
CREATE TABLE group (username text, groupname text, PRIMARY KEY (username));
使用 lightweight transactions 您可以阻止对用户组的更新:
INSERT INTO group (username, groupname) VALUES ('joe', 'wheel') IF NOT EXISTS;
如果要按组查询,创建物化视图:
CREATE MATERIALIZED VIEW usersbygroup AS
SELECT groupname, username FROM group
PRIMARY KEY (groupname, username);