没有多余的表或列,如何规范化?

时间:2017-03-14 17:04:02

标签: mysql permissions attributes relational-database schema

我在MySQL中使用基于属性的权限方案制作数据库架构时遇到了问题。

我的应用程序中有三层用户。我们将它们称为1,2和3层。在第1层,我将获得第1层,第2层和第3层的权限集。在第2层,我将拥有第2层和第3层的权限集。在第3层,我将只有第1层的权限集。

每个层都使用一些标准权限。但是,每个层至少有一个仅对该层唯一的权限标志。此外,有两个层使用的权限,但不是第三个。

我的问题是如何存储这些数据。我只能想出两种方法,而且两种方式都错了......

1)每一行都有一个包含每个权限标志的表。

(这似乎会导致大多数行都有一堆未使用的列,而且似乎很难维护,因为我必须记住哪个层使用哪个权限。)

2)制作SEVEN表。一个用于基本权限的表,一个用于每个层的表及其特定权限,以及一个用于每个2层组合的表。

(这似乎完全矫枉过正,并且使得批量检索用户权限的过程变得复杂。)

1 个答案:

答案 0 :(得分:1)

忘记当前的权限和层级设置 - 可能会改变。

您通常希望的是,如果情况发生变化,您可以通过更新,删除,插入行而不是架构更改进行调整。因此,(1)不允许新的权限(2)完全取决于哪些权限在哪些层中。

保持一般性,层有多个权限,权限可以是多层:

Tiers: id, name
Permissions: id, name
AllowedPermissions: id, tierId, permId // one row per allowed combo

如果要对层继承进行建模,可以向层级添加parentTierId或类似的东西。如果某些权限未被继承,您还可以向inheritable添加Permissions列(因为您说:"每个层至少有一个权限标志仅对该层唯一。" )