程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了跨 4 个表的多对多关系大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决跨 4 个表的多对多关系?

开发过程中遇到跨 4 个表的多对多关系的问题如何解决?下面主要结合日常开发的经验,给出你关于跨 4 个表的多对多关系的解决方法建议,希望对你解决跨 4 个表的多对多关系有所启发或帮助;

我正在实现一个基于角色的访问控制系统,它具有以下数据库表。

groups
---------
ID (PK)
name
level

resources
---------
ID (PK)
name

roles
---------
ID (PK)
name

permissions
-----------
ID (PK)
name
description


users
-----------
ID (PK)
name
group_ID(FK - references ID on groups)
role_ID(FK - references ID on roles)

组与资源和角色之间存在多对多关系。所以我有以下连接表。

group_resource
---------------
group_ID(FK - references ID on groups)
resource_id(FK - references ID on resources)

group_role
---------------
group_ID(FK - references ID on groups)
role_ID(FK - references ID on roles)

问题来了:

组内的任何给定角色都应仅拥有分配给该组的资源的权限。

我不完全确定在 roles{{ 的上下文中对 permissionsresourcesgroup_resource 之间的关系建模的最佳方法是什么1}} 关系。

任何建议将不胜感激。

谢谢。

解决方法

这是一个可能的解决方案,具有一定程度的冗余。

groups (id (PK),name,level)
roles (group_id (FK for groups),num_role,Name) with PK (group_id,num_rolE)
users (id (PK),group_id,num_rolE) with (group_id,num_rolE) FK for roles
resource_types (id (PK),Name)
group_resources (resource_type_id (FK for resource_types),group_id (FK for groups) with PK both the attributes
permissions (resource_type_id (FK for resource_types),description)  with (group_id,num_rolE) FK for roles

使用此解决方案,应用程序必须在插入权限期间检查资源是否出现在权限中指定的 group_id 中,通常使用触发器。

完全消除这种冗余的一种方法(但在我看来是一种不太令人满意的设计)是消除关系 group_resources,因为所有信息都可以通过权限找到。

,
-- Group GRP exists.
--
group {GRP}
   PK {GRP}
-- Role ROL exists.
--
role {ROL}
  PK {ROL}
-- resource RES exists.
--
resource {RES}
      PK {RES}
-- Role ROL exists within group GRP.
--
group_role {GRP,ROL}
        PK {GRP,ROL}

FK1 {ROL} REFERENCES role  {ROL}
FK2 {GRP} REFERENCES group {GRP}
-- Group GRP is assigned resource REs.
--
group_resource {GRP,RES}
            PK {GRP,RES}

FK1 {GRP} REFERENCES group    {GRP}
FK2 {RES} REFERENCES resource {RES}
-- Permission PER exists.
--
permission {PER}
        PK {PER}
-- Permission PER is granted to role ROL
-- in group GRP for resource REs.
--
group_resource_permission {GRP,RES,ROL,PER}
                       PK {GRP,ROL}

FK1 {GRP,RES} REFERENCES group_resource {GRP,RES}
FK2 {GRP,ROL} REFERENCES group_role     {GRP,ROL}
FK3 {PER}      REFERENCES permission     {PER}
-- User USR is assigned role ROL in group GRP.
--
user {USR,GRP,ROL}
  PK {USR}

FK1 {ROL} REFERENCES role  {ROL}
FK2 {GRP} REFERENCES group {GRP}
-- User USR in role ROL of group GRP,-- has permission PER to resource REs.
--
create view user_resource_permission
AS
SELECT  u.USR,x.RES,x.PER,u.GRP,u.ROL
FROM user as u
JOIN group_resource_permission as x ON x.GRP = u.GRP
                                   AND x.ROL = u.ROL ;

注意:

All attributes (columns) NOT NULL

PK = PriMary Key
AK = Alternate Key   (UniquE)
SK = Proper Superkey (UniquE)
FK = Foreign Key

大佬总结

以上是大佬教程为你收集整理的跨 4 个表的多对多关系全部内容,希望文章能够帮你解决跨 4 个表的多对多关系所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。