Cassandra:为用户、角色和权限设计数据模型

标签 cassandra cql3

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

  1. 每个组织都可以有用户和角色
  2. 每个用户可以属于多个角色
  3. 每个角色可以拥有一定数量的用户和权限。

因此,根据上述设计要求,我的疑问如下:

  1. 对于组织,获取所有用户/角色
  2. 对于用户,获取所有角色
  3. 对于角色,获取所有用户/权限

有人可以帮我设计满足上述要求的数据模型吗?

最佳答案

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));

再次为组织创建索引。

以下是示例行:

 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}

关于Cassandra:为用户、角色和权限设计数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18158441/

相关文章:

java - Cassandra 和插入 float 列

cassandra - 如何列出 Cassandra 中所有可用的键空间?

java - 在 Cassandra 中复制 Column family 的最快方法是什么?

cassandra - 如果 Cassandra 中的节点被替换,数据会自动复制到该节点吗?

在 Cassandra 的列表中搜索多个元素

Cassandra:避免在整个系统范围内禁用交换系统?

cassandra - 仅在 cassandra 集群中的一个数据中心插入行

cql - 无法在 Mac OS X 中启动 cqlsh?

java - Cassandra Java Driver : How are insert,更新、删除结果报错?

database - 用于分页的 Cassandra CQL token 函数