【问题标题】:Database design, which table has the foreign key数据库设计,哪个表有外键
【发布时间】:2010-12-24 12:44:26
【问题描述】:

我有一个表USER(USER_ID、密码、姓名...)和一个表ACCESS_ROLES供用户使用,每个用户都可以有一个ACCESS_ROLE(一对一)。

哪个表有外键?
我会将USER_ID 放入ACCESS_ROLES 表中。有没有最佳实践方法?

【问题讨论】:

  • 如果是一对一的,那么听起来好像都应该进入同一个表?嗯,这真的取决于你需要什么。
  • 听起来更像是多对一(因为许多用户可以拥有一个 access_role)

标签: sql database-design data-modeling


【解决方案1】:

如果您有一组固定的访问角色和任意数量的用户,其中一个用户被分配了一个且只有一个访问角色,并且可以为任意数量的用户分配一个给定的访问规则 [这就是我解释您的问题的方式],然后您将在您的 USERS 表中放置一个类似“AccessRoleId”的列,并在 ACCESS_ROLES 中添加一个外键约束。

【讨论】:

  • 那么外键约束不应该进入USER表吗?
  • 根据您的回复,没有。如果 UserId 是 Access_Roles 中的一列,并且是用户中的 FK,那么这意味着每个访问角色都与一个且只有一个用户相关联......并且可能许多用户将没有分配的访问角色。
  • @DanielVassallo 将外键约束应用于 ACCESS_ROLES 表,以防止人们删除 access_roles 中的记录(如果有任何用户记录引用它们)
【解决方案2】:

由于您将建立一对一的关系,因此 Philip Kelley 建议的解决方案更好。只需在USER 中添加一个名为access_role_id 的新列,然后对USER 表执行外键,如下所示:

ALTER TABLE USER ADD CONSTRAINT fk_access_roles_users
                 FOREIGN KEY (access_role_id) 
                 REFERENCES ACCESS_ROLES(access_role_id);

不要按照您的建议将USER_ID 添加到ACCESS_ROLES 表中。

【讨论】:

    【解决方案3】:
    • 如果每个 USER 恰好(或最多)一个 ACCESS_ROLE。
    • 一个 ACCESS_ROLE 可以有多个 USER

    然后:

    • FK 父级是 ACCESS_ROLE 并链接到 ACCESS_ROLES 表的 PK
    • FK 子项是 USERS,FK 列是 ACCESS_ROLE 列

    注意:外键“父”列必须是唯一的。如果每个 ACCESSROLE 有多个用户,则 FK 必须从 USERS 到 ACCESSROLES

    在 SQL Server 中

    ALTER TABLE USERS WITH CHECK ADD
    CONSTRAINT FK_USERS_ACCESS_ROLES FOREIGN KEY (ACCESS_ROLE) REFERENCES ACCESS_ROLES (ACCESS_ROLE /*PK?*/)
    

    【讨论】:

      【解决方案4】:

      如果您有一对一的映射,我会将外键放入您将在大部分时间查询的表中。

      【讨论】:

        【解决方案5】:

        您可以向 ACCESS_ROLES 添加外键

        以及以下强制一对一映射

        UNIQUE (ACCESS_ROLES_ID, USER_ID)
        

        【讨论】:

          【解决方案6】:

          有什么最佳实践方法吗?

          是的,有!

          primary key 一样,foreign key 也是constraint 的一种类型,位于表格的一个或多个列上。

          foreign key 在另一个表中的键列和相关列之间建立链接。 (您还可以将外键列链接到同一个表中的列。)

          包含外键的表为子表,外键引用的表为父表。

          要点

          1. foreign key 必须引用 primary keyunique constraint,尽管该引用可以在同一个表或不同表上。
          2. foreign key 的列数也必须与引用的约束中的列数相同,并且相应列之间的数据类型必须匹配。
          3. Primary key 不同,Foreign key 列可以包含NULL 值。

          【讨论】:

          【解决方案7】:

          不确定我是否理解这个问题:我认为 access_table 应该有外键。

          【讨论】:

          • 如果您不确定问题,请不要浪费宝贵的时间来回答。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-14
          • 1970-01-01
          • 2012-05-28
          • 1970-01-01
          • 2014-07-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多