我有一张Cassandra桌
CREATE TABLE users_by_id (
id bigint PRIMARY KEY,
name text,
email text,
password text,
);
和
CREATE TABLE members_by_org_id_user_id (
organisation bigint,
user bigint,
roles set<bigint>,
PRIMARY KEY (organisation, user)
) WITH CLUSTERING ORDER BY (user DESC);
如果我想找回 name
对于一个组织的每个成员,我可以: SELECT user FROM members_by_org_id_user_id WHERE organisation = ?
然后表演 SELECT name FROM users_by_id WHERE id in ?
(协调器必须联系多个节点?=坏的是在关系Cassandra坏查询?) SELECT user from MEMBERS_by_org_id_user_id WHERE organisation = ?
然后对每个用户执行查询 SELECT name FROM users_by_id WHERE id = ?
(应用程序必须联系许多节点,因为用户的主键不同?=不那么糟糕?不完美)
改变 members_by_org_id_user_id
到
CREATE TABLE members_by_org_id_user_id (
organisation bigint,
user bigint,
name text,
email text,
PRIMARY KEY (organisation, user)
) WITH CLUSTERING ORDER BY (user DESC);
第三种方法的问题是,如果用户被更新,与该用户相关的所有成员行也将需要更新,这虽然允许应用程序只联系一个节点,但意味着每次更新可能需要进行多次写入?
如何对数据进行建模以减少或完全消除这些问题?
从理论上讲,一个组织最多可以由2000名成员组成,一个用户最多可以在20个组织中工作。
1条答案
按热度按时间sxpgvts31#
将“名称”列放入
members_by_org_id_user_id
表将解决您当前的问题,但如果您需要获取用户的email
在将来或您可能添加的任何其他列中。应用程序必须联系多个节点
自从你用过
user id
作为主键(id
列)中users_by_id
表,则cassandra不会逐个遍历每个节点-它知道在哪里可以找到您的用户。因为您使用的是单个主键,所以它也是分区键。这是在cassandra中查询表最有效的方法之一。在我看来,选项2是数据建模的最佳方法,但正如@alex ott的问题所指出的,这些表的大小可能是使用“where in”子句解决方案的关键因素。
编辑:
datastax是如何完成读取请求的?文章是理解Cassandra阅读策略的重要资源。