我需要在cassandra中为用户,角色,组织和权限设计数据模型。
因此,根据上述设计要求,以下是我的查询:
任何人都可以帮我设计满足上述要求的数据模型。
答案 0 :(得分:5)
Cassandra没有像关系数据库那样的外键关系(请参阅here和here),这意味着您无法连接多个列系列来满足给定的查询请求。
以下是两种可能的解决方案:
解决方案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}