【问题标题】:How to normalize without excessive tables or columns?如何在没有过多表或列的情况下进行规范化?
【发布时间】:2017-03-15 01:33:43
【问题描述】:

我无法在 MySQL 中为基于属性的权限方案创建数据库架构。

我的应用程序中有三层用户。我们称它们为第 1、2 和 3 层。在第 1 层,我将拥有第 1、2 和 3 层的权限集。在第 2 层,我将拥有第 2 层和第 3 层的权限集。在第 3 层,我将只有一个权限设置为 1 级。

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

我的问题是如何存储这些数据。我只能想出两种方法,似乎都错了……

1) 有一个表,每一行都有每个权限标志。

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

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

(这似乎完全是矫枉过正,并且使检索用户权限的过程复杂化了很多。)

【问题讨论】:

    标签: mysql permissions attributes relational-database schema


    【解决方案1】:

    忘记当前的权限和层级设置——也许这会改变。

    您通常想要的是,如果事情发生变化,您可以通过更新、删除、插入行来适应,而不是架构更改。因此,(1) 不允许新权限 (2) 完全取决于哪些权限在哪些层中。

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

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

    如果您想对层继承进行建模,您可以将parentTierId 添加到层或类似的东西。如果某些权限没有被继承,您还可以在Permissions 中添加一个inheritable 列(因为您说过:“每一层至少有一个仅对该层唯一的权限标志。”)

    【讨论】:

    • 啊,所以我只需将 userId、tier 和权限存储在一行中。每个用户将拥有与他们拥有的权限一样多的行。是否需要在数据库中定义可用权限,或者我可以在我的模型中定义它们吗?
    • 如果您想从数据库行控制应用程序行为,您需要将可用权限存储在数据库中并让应用程序读取它们。
    猜你喜欢
    • 2013-04-22
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多