用限制代表多对多

时间:2014-10-26 16:44:38

标签: sql many-to-many rdbms

我有三个主要表格:

users
=====
user_id
user_email

organizations
=============
organization_id
organization_name
organization_phone_number

roles
=====
role_id
role_name

用户和组织有很多:很多关系:单个用户可以属于多个组织,同一个组织可以有多个用户。

用户和角色排序还有很多:很多关系:单个用户可以拥有多个角色,一个角色可以属于多个用户。 但是,角色是特定于组织的。意思是,如果用户1属于组织1,他们将在"域中拥有1+个角色"那个组织。如果他们也属于组织2,他们将为该组织拥有1个完全不同的角色。

因此,给定以下角色列表:AdminDogCatLionBearFish和{ {1}},您可能拥有:用户1属于组织1,他/她是Frog。但是用户1也可能属于组织2,他/她是AdminCatLion

我正在寻找合适的表格结构来代表这些受限制的许多人:很多关系。

它不仅仅像添加Frogusers_x_organizations人行横道表一样简单:

users_x_roles

这还不够,因为它不代表用户的每个组织的角色列表。它只允许我表示用户1同时属于组织1和组织2,并且在他们所有的成员组织之间,他们是管理员,猫,狮子和青蛙。它没有告诉我,对于Org 1,他们只是一个管理员,等等。我在哪里画了一个心理空白,有什么想法?

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,问题是如何保证关系完整性。也就是说,如何保证用户的角色与同一用户的组织匹配。

一般方法是使用约束或触发器。在大多数数据库中,不支持或者有点痛苦地执行跨数据库约束。因此,触发器可以保证完整性。另一种方法(我会这样做)是将所有数据修改代码包装在存储过程中,并在存储过程代码中显式进行验证。

哪种方法更好取决于您的应用程序以及组织和角色之间的相互作用。如果组织之间共享大多数或所有角色,则可能首选第一种方法。如果角色高度针对组织,则可能首选第二种方法。