数据库属性可以是主键还是外键?

问题描述 投票:5回答:2

我有2张桌子,UserEmployee。每个用户都有一个User_ID,这是User表中的主键和Employee表中的外键。 Employee表中的该属性也可以是主键吗?

database foreign-keys primary-key relational-database
2个回答
22
投票

如果两个表之间具有一对一的关系,则详细信息表的主键也是外键。

 master           detail (1 : 1)
+----------+ 1:1 +-------------+
| PK  id   |<---o| PK FK  id   |
+----------+     +-------------+
|     col1 |     |        col1 |
|     col2 |     |        col2 |
|     etc. |     |        etc. |
+----------+     +-------------+

如果您具有m-to-n关系,则联结表具有与m和n表的两个主键相关的列。这些列同时是主键和外键。

                    m : n
 m_table          junction
+----------+ 1:m +------------+      n_table
| PK  id1  |<---o| PK FK1 id1 | n:1 +----------+
+----------+     | PK FK2 id2 |o--->| PK  id2  |
|     col1 |     +------------+     +----------+
|     col2 |     |            |     |     col1 |
|     etc. |     +------------+     |     etc. |
+----------+                        +----------+

请注意,使用此构造时,一个表的记录只能链接到另一个表的特定记录一次,因为联结表的每个复合主键必须是唯一的。如果要允许非唯一配对,请在联结表中定义单独的主键:

                    m : n
                  junction
                 +---------+
 m_table         | PK  id  |
+----------+ 1:m +---------+      n_table
| PK  id1  |<---o| FK1 id1 | n:1 +----------+
+----------+     | FK2 id2 |o--->| PK  id2  |
|     col1 |     |         |     +----------+
|     col2 |     +---------+     |     col1 |
|     etc. |                     |     etc. |
+----------+                     +----------+

在这种情况下,主键和外键约束设置在不同的列上。或者,您也可以使用两个外键以及一个分子或另一个辨别属性来构建主键。


在你的情况下,如果UserEmployee之间存在一对一或一对一或一对一的关系,那么是的,User_ID表中的Employee可以是外键(FK)和主键( PK)同时。换句话说,这意味着:用户也可以是员工,在这种情况下,员工数据将附加到用户。如果他不是雇员(他可能是外部专家),则不附加员工记录。如果User_IDEmployee中是FK和PK,则每个用户最多可以附加一个员工记录。如果User_ID在表Employee中只是FK而不是PK,那么用户可以拥有多个相关的员工记录。


2
投票

是。例如,如果您想强制所有员工都是用户,而某些用户可以是员工,那么您可以这样做。这将是(零或一)到一个关系。

否则,您通常不会使主键与外键相同,尽管它可能包含外键,就像多表关系的联结表一样。

© www.soinside.com 2019 - 2024. All rights reserved.