gpt4 book ai didi

mysql - 如何设计: users with different roles see different records

转载 作者:行者123 更新时间:2023-11-29 12:50:07 27 4
gpt4 key购买 nike

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

规范:
对于一家公司来说,有4个角色:公司(老板)/部门(经理)/团队(领导)/成员(销售),大约有100万条客户记录。每个客户记录都可以由某人拥有,他可以是老板、经理、领导者或销售人员。如果该记录的所有者是某个销售人员,那么他的上级(比如:他的领导/经理/老板)也可以看到该记录(但其他人:比如他的同级同事,看不到,除非他的上级经理共享该记录)客户对他的同事),但如果记录的所有者是老板,那么除了老板本人之外,没有人可以看到它。

我的设计是这样的(我想改进它,使其更加简单明了):
表:
部门:
id(PK 部门 ID)
d_name(部门名称)
p_id(父部门 ID)

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

employee_roles
id(PK)
e_id(员工 ID)
d_id(部门 ID)

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

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

PS:每个员工可以担任多个角色,例如员工A可以是部门_I的经理,同时他也可以是部门_II>>团队_X的销售人员。

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

  • SELECT * FROM 客户 AS a INNER JOIN 权限 AS b ON a.id =b.c_id AND (b.d_id IN ${DEP_ARRAY} OR e_id = ${LOGIN_EMPLOYEE_ID} ORshare_to = ${LOGIN_EMPLOYEE_ID})

我不太喜欢上面的SQL,尤其是“IN”子句,因为我担心它会减慢查询速度,因为客户中有大约100万条记录甚至更多 table ;而且,permissions 表中的记录数量与 customers 表一样多,INNER JOIN 也可能会非常慢。 (所以我关心的是和大家一样的表现:))

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

最佳答案

不要使用数组,使用表,即select语句的值。在您了解有关表和查询的更多基础知识之前,请不要担心性能。

关系模型的要点是,如果将数据构建为表,那么您可以无循环地描述输出表,并且 DBMS 会计算出如何计算它。请参阅this 。不要想着“加入”;考虑描述结果。无论 DBMS 最终做什么都是它的事而不是你的事。只有当您了解描述的变化和描述选项之后,您才具备了解性能的基本知识。

关于mysql - 如何设计: users with different roles see different records,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24880021/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com