cassandra在vs多查询vs变化模型中的应用

gk7wooem  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(311)

我有一张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个组织中工作。

sxpgvts3

sxpgvts31#

将“名称”列放入 members_by_org_id_user_id 表将解决您当前的问题,但如果您需要获取用户的 email 在将来或您可能添加的任何其他列中。
应用程序必须联系多个节点
自从你用过 user id 作为主键( id 列)中 users_by_id 表,则cassandra不会逐个遍历每个节点-它知道在哪里可以找到您的用户。因为您使用的是单个主键,所以它也是分区键。这是在cassandra中查询表最有效的方法之一。
在我看来,选项2是数据建模的最佳方法,但正如@alex ott的问题所指出的,这些表的大小可能是使用“where in”子句解决方案的关键因素。
编辑:
datastax是如何完成读取请求的?文章是理解Cassandra阅读策略的重要资源。

相关问题