【问题标题】:Many-To-Many Cassandra Database多对多 Cassandra 数据库
【发布时间】:2015-08-17 06:08:11
【问题描述】:

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

所以我为四张桌子建模。 users (by_id)、projects (by_id)、projects_by_user_id 和 users_by_project_id。

------------ ------------ -------- -------- ------------- |用户 | |项目 | | projects_by_user | | users_by_project | |----------| |--------- | |-----------------| |-----------------| |编号 K | |编号 K | |用户 ID K | | project_id K | |姓名 | |姓名 | | project_id C | |用户 ID C | ------------ ------------ |项目名称 S | |用户名 S | -------------------- --------

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

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

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

不先读取大量数据有没有更好的方法?

【问题讨论】:

    标签: cassandra many-to-many datastax


    【解决方案1】:

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

    如果你这样定义表:

    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。

    【讨论】:

    • 这个问题是,我不能查询特定用户的所有项目。但是对数据进行非规范化的想法更有意义。因此,如果我阅读了一个项目,我也会获得所有需要更新 projects_by_user 表的 user_id。有一个可管理的可以访问项目的用户列表。顺便提一句。也会有一些团体可以按照相同的模式访问该项目。
    【解决方案2】:

    我认为没有更好的方法。 Cassandra 对您可以进行的查询有很多限制。在您的情况下,您必须创建一个复合键(user_id,project_id),并且为了更新它,您必须在 where 子句中提供这两个部分,这意味着您必须读取特定项目的所有用户并更新每个用户。如果你有一个大型数据库并且这种情况经常发生,这将是一个很大的开销,所以我想最好从表中删除 projectname 字段并在应用程序级别执行项目和 projects_by_users 的连接。

    顺便说一句:您这里描述的场景对于关系数据库模型来说更方便,所以如果您的数据库模型的其余部分与此类似,我会考虑使用一些关系数据库。

    【讨论】:

      猜你喜欢
      • 2014-01-23
      • 2019-10-22
      • 2011-03-02
      • 2011-07-18
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多