数据库设计,哪个表有外键

时间:2009-12-08 17:51:44

标签: sql database-design data-modeling

我为用户提供了一个表USER(USER_ID,PASSWORD,NAME,...)和一个表ACCESS_ROLES,每个用户都可以拥有一个ACCESS_ROLE(一对一) ONE)。

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

7 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

由于您将建立一对一的关系,因此Philip Kelley建议的解决方案更好。只需在名为USER的{​​{1}}中添加一个新列,然后在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表格中。

答案 2 :(得分:2)

  • 如果每个USER都有(或最多)一个ACCESS_ROLE。
  • 一个ACCESS_ROLE可以有多个USER

然后:

  • FK parent是ACCESS_ROLE并链接到ACCESS_ROLES表的PK
  • FK child是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?*/)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以向ACCESS_ROLES

添加外键

以及以下内容强制执行一对一映射

UNIQUE (ACCESS_ROLES_ID, USER_ID)

答案 5 :(得分:0)

  

有没有最佳做法?

是的,有!

primary key类似,foreign key也是放在表格中一列或多列上的constraint类型。

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

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

要点

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

答案 6 :(得分:-1)

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