【问题标题】:Foreign key to reference all records or no records in junction table外键引用联结表中的所有记录或没有记录
【发布时间】:2014-11-10 22:50:34
【问题描述】:

这似乎是一个理想的功能,但我似乎无法弄清楚当外键是主键(复合键)的一部分时我会怎么做。

该表是一个简单的联结表,用于引用用户有权访问的 User.id 和 Access.id 引用函数的多对多关系:

Column |  References
user      user.id
access    access.id

因此,每个用户和每个访问级别都可以有许多条目。为了简化“超级用户”的操作,我想为access 设置一个NULL 值,这意味着他们可以访问每个页面(这是我想出如何输入不引用行的值的唯一方法在access 表中)。问题是 MySQL 不允许将 NULL 值作为主键的一部分。

是否有解决NULL 主键问题的方法,或者是否有另一种方法可以引用外键中的每一行(或无行)?我能想到的唯一其他方法是禁用外键或必须为表中的每个 access.id 添加一行。其中任何一种都是不可取的。

【问题讨论】:

    标签: mysql foreign-key-relationship composite-key junction-table


    【解决方案1】:

    大概你的用户表上有一个超级用户标志。您可以将每个超级用户的笛卡尔连接和一组可用的访问 ID 联合到您需要的任何查询中。

    根据您的操作,您也可以不将超级用户的访问权限存储在数据库中,并在代码中对它们进行不同的处理 - 即,一旦您将它们建立为 SU,就忽略访问检查。不过取决于您的应用程序。

    【讨论】:

    • 感谢您的贡献。这个问题对我来说既是理论也是实践,所以我将看看在连接表或关系表的设计上是否可以做任何事情,而不是更改代码或添加新表。
    • 您不必添加新表,只需更改查询即可。当然,除非您没有超级用户标志,否则您将无法添加所有访问 ID。
    【解决方案2】:

    我认为 NULL 是允许的,您可以将它与 user.id 一起用作唯一组合。但我不确定这是否是一个好方法。我的意思是你可以将超级用户设置存储在一个列中,然后在代码中使用它。

    【讨论】:

    • 唯一键无效。这种类型的关系应该让这些字段成为复合键,这就是问题所在。
    • 很抱歉使用了独特的词。我的意思是允许 NULL 作为主键/复合键的值。
    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2023-03-20
    • 2016-07-12
    相关资源
    最近更新 更多