Cassandra:用户,角色和权限的设计数据模型

时间:2013-08-10 03:44:19

标签: cassandra cql3

我需要在cassandra中为用户,角色,组织和权限设计数据模型。

  1. 每个组织都可以拥有用户和角色
  2. 每个用户都可以属于角色数
  3. 每个角色可以拥有多个用户和权限。
  4. 因此,根据上述设计要求,以下是我的查询:

    1. 组织获取所有用户/角色
    2. 对于用户获取所有角色
    3. 对于角色获取所有用户/权限
    4. 任何人都可以帮我设计满足上述要求的数据模型。

1 个答案:

答案 0 :(得分:5)

Cassandra没有像关系数据库那样的外键关系(请参阅herehere),这意味着您无法连接多个列系列来满足给定的查询请求。
以下是两种可能的解决方案:


解决方案1:对组织和用户进行反规范化。

只需创建一个Users表(即非规范化表),类似于以下内容:

create table Users (
        ... organization ascii,
        ... uid int primary key,
        ... role set<ascii>,
        ... permission set<ascii>);

并为组织创建一个索引以允许查询非键列:

create index demo_users_organization on users (organization);

这可以满足您的前两个要求:

查询1 ---对于组织,获取所有用户/角色:

cqlsh:demo> select * from users where organization='stack overflow';

 uid | organization   | permission                               | role
-----+----------------+------------------------------------------+-----------------------------
   1 | stack overflow |                     {down-vote, up-vote} |                  {end user}
   2 | stack overflow |         {close-vote, down-vote, up-vote} |       {end user, moderator}
   3 | stack overflow | {close-vote, down-vote, reboot, up-vote} | {end user, moderator, root}

查询2 ---为用户获取所有角色

cqlsh:demo> select role from users where uid = 2;

 role
-----------------------
 {end user, moderator}

但是,由于尚未支持集合索引,因此该非规范化表无法满足您的第三个要求:

cqlsh:demo> create index demo_users_role on users (role);
Bad Request: Indexes on collections are no yet supported

解决方案2:对组织,用户和角色进行非规范化。

解决方案1的一个解决方法是进一步反规范化用户和角色,其中每个(用户,角色)对在表中有一行:

cqlsh:demo> create table RoleUsers (
    ... uid int,
    ... organization ascii,
    ... role ascii,
    ... permission set<ascii>,
    ... primary key(uid, role));

再次为organization创建索引。

以下是示例行:

 uid | role      | organization   | permission
-----+-----------+----------------+------------------------------------------
   1 |  end user | stack overflow |                     {down-vote, up-vote}
   2 |  end user | stack overflow |         {close-vote, down-vote, up-vote}
   2 | moderator | stack overflow |         {close-vote, down-vote, up-vote}
   3 |  end user | stack overflow | {close-vote, down-vote, reboot, up-vote}
   3 | moderator | stack overflow | {close-vote, down-vote, reboot, up-vote}
   3 |      root | stack overflow | {close-vote, down-vote, reboot, up-vote}

现在,您可以执行第三个查询。

查询3 ---对于角色获取所有用户/权限:

cqlsh:demo> select uid from roleusers where role='moderator' allow filtering;

 uid | permission
-----+------------------------------------------
   2 |         {close-vote, down-vote, up-vote}
   3 | {close-vote, down-vote, reboot, up-vote}