我有三个主要表格:
users
=====
user_id
user_email
organizations
=============
organization_id
organization_name
organization_phone_number
roles
=====
role_id
role_name
用户和组织有很多:很多关系:单个用户可以属于多个组织,同一个组织可以有多个用户。
用户和角色排序还有很多:很多关系:单个用户可以拥有多个角色,一个角色可以属于多个用户。 但是,角色是特定于组织的。意思是,如果用户1属于组织1,他们将在"域中拥有1+个角色"那个组织。如果他们也属于组织2,他们将为该组织拥有1个完全不同的角色。
因此,给定以下角色列表:Admin
,Dog
,Cat
,Lion
,Bear
,Fish
和{ {1}},您可能拥有:用户1属于组织1,他/她是Frog
。但是用户1也可能属于组织2,他/她是Admin
,Cat
和Lion
。
我正在寻找合适的表格结构来代表这些受限制的许多人:很多关系。
它不仅仅像添加Frog
和users_x_organizations
人行横道表一样简单:
users_x_roles
这还不够,因为它不代表用户的每个组织的角色列表。它只允许我表示用户1同时属于组织1和组织2,并且在他们所有的成员组织之间,他们是管理员,猫,狮子和青蛙。它没有告诉我,对于Org 1,他们只是一个管理员,等等。我在哪里画了一个心理空白,有什么想法?
答案 0 :(得分:1)
你基本上有两个选择。您可以将角色分离为特定于每个组织,或者您可以在所有组织中拥有共同角色。例如,无论组织如何,“admin”角色都具有相同的role_id
吗?或者,每个组织都会有一个单独的“管理员”角色。
在第一种情况下(角色在组织之间共享),您的角色表将是users_x_organizations_x_roles
,带有三个外键。您是否需要users_x_organizations
成为有关要求的问题。你可以有一个“属于”的“角色”。那么users_x_organizations
确实是:
select user_id, org_id
from users_x_organizations_x_roles uor
where role_id = 'belongs_to';
或者任何角色就足够了:
select distinct user_id, org_id
from users_x_organizations_x_roles uor;
在第二种情况下(角色是特定于组织的),您的角色表将是users_x_roles
,问题是如何保证关系完整性。也就是说,如何保证用户的角色与同一用户的组织匹配。
一般方法是使用约束或触发器。在大多数数据库中,不支持或者有点痛苦地执行跨数据库约束。因此,触发器可以保证完整性。另一种方法(我会这样做)是将所有数据修改代码包装在存储过程中,并在存储过程代码中显式进行验证。
哪种方法更好取决于您的应用程序以及组织和角色之间的相互作用。如果组织之间共享大多数或所有角色,则可能首选第一种方法。如果角色高度针对组织,则可能首选第二种方法。