多对多Cassandra数据库

中国

假设我有用户。这些用户可以访问多个项目。因此,一个项目也可以允许多个用户。

因此,我为四个表建模。用户(by_id),项目(by id),projects_by_user_id和users_by_project_id。

----------- ------------ -------------------- ------- ------------- 
| 用户| | 项目| | projects_by_user | | users_by_project | 
| --------- | | --------- | | ------------------ | | ------------------ | 
| ID K | | ID K | | user_id K | | project_id K | 
| 名称| | 名称| | project_id C | | user_id C | 
----------- ------------ | project_name S | | user_name S | 
                               -------------------- --------------------

因此,将user_name存储在users_by_project中,将projet_name存储在projects_by_user表中以进行查询。

我的问题是,当用户更新project_name时,这当然会更新projects表。但是为了数据一致性,我还需要更新projects_by_user表中的每个分区。

据我所知,这只能通过从users_by_project表中查询所有用户并为每个用户进行更新来实现。

如果没有先读取大量数据,还有什么更好的方法吗?

吉姆·迈耶(Jim Meyer)

我不明白为什么你需要四个桌子。您的用户和项目表可能包含所有数据。

如果您按以下方式定义表:

CREATE TABLE users (
    user_id int PRIMARY KEY,
    name text,
    project_ids list<int> );

CREATE TABLE projects (
    project_id int PRIMARY KEY,
    name text,
    user_ids list<int> );

然后,每个用户将具有他们有权访问的项目ID的列表,并且每个项目将具有对其具有访问权限的用户的列表。

要向用户1添加对项目123的访问,请运行:

BEGIN BATCH
UPDATE users SET project_ids = project_ids + [123] WHERE user_id=1;
UPDATE projects SET user_ids = user_ids + [1] WHERE project_id=123;
APPLY BATCH;

要更改项目名称,您只需执行以下操作:

UPDATE projects SET name = 'New project name' WHERE project_id=123;

为简单起见,我将id字段显示为int,但通常您会使用uuid。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章