如何设计:具有不同角色的用户可以看到不同的记录

时间:2014-07-22 06:03:46

标签: mysql database database-design rbac

我的应用程序有一个架构设计问题,希望我能得到老师的建议。这与基于角色的访问控制非常相似,但在细节上有点不同。

规格:
对于一家公司,有4个角色:公司(老板)/部门(经理)/团队(领导)/会员(销售),并且有大约100万个客户记录。每个客户记录都可以由某人拥有,他可以是Boss或经理或领导者或销售人员。如果唱片的所有者是某个销售人员,那么他的高年级(比如:他的领导/经理/老板)也可以看到这个记录(但是其他人:说他的同事级别相同,看不见,除非他的上层等级经理与客户分享客户),但如果记录的所有者是老板,除了老板本人之外没有人可以看到它。

我的设计是这样的(我希望改进它以使其更简单明了):
表:
部门
id (P.K. deparment id)
d_name (部门名称)
p_id (父部门ID)

员工
id (P.K。员工ID)
e_name (员工姓名)

employee_roles
id (P.K.)
e_id (员工ID)
d_id (部门ID)

客户
id (P.K。客户ID)
c_name (客户名称)
c_phone (客户电话)

权限
id (P.K.)
c_id (客户ID)
e_id (所有者员工ID)
d_id (此客户属于哪个部门)
share_to (此客户分享给其他人的身份)

P.S。:每个员工可以有多个角色,例如,员工A可以是department_I的经理,同时他也可以是deparment_II>>的一个销售人员。 Team_X。

因此,当员工通过查询 employee_roles 表登录应用程序时,我们可以获取所有部门ID和子部门ID,并将其保存到阵列中。
然后,我可以使用此阵列从权限表进行查询,并将其与客户表连接,以获取此员工应该看到的所有客户。 SQL可能如下所示:

  • SELECT * FROM customers AS a INNER JOIN权限AS b ON a.id = b.c_id AND(b.d_id IN $ {DEP_ARRAY}或e_id = $ {LOGIN_EMPLOYEE_ID}或 share_to = $ {LOGIN_EMPLOYEE_ID})

我不喜欢上面的SQL,特别是" IN"因为我担心它会减慢查询速度,因为客户表中有大约100万条记录甚至更多;并且,权限表中的客户表会有尽可能多的记录, INNER JOIN 也可能非常慢。 (所以我关心的是每个人的表现:))

据我所知,这是我能解决的最好的设计,请教老师请帮忙就这个问题给我一些建议?如果您需要更多信息,请告诉我。 任何建议将不胜感激! 提前一百万感谢!!

1 个答案:

答案 0 :(得分:1)

不要使用数组,使用表,即select语句的值。并且在了解有关表和查询的思考的基础知识之前,不要再担心性能了。

关系模型的要点是,如果将数据结构化为表格,则可以循环描述输出表格,DBMS会计算出如何计算数据。见this。不要考虑"加入&#34 ;;考虑描述结果。无论DBMS最终做什么,其业务都不是你的。只有在您了解了描述和描述选项的变化之后,您才能掌握基本知识以了解绩效。