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

时间:2012-02-11 22:02:34

标签: database foreign-keys primary-key relational-database

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

2 个答案:

答案 0 :(得分: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_IDEmployee表中可以同时使用外键(FK)和主键(PK)。换句话说,这意味着:用户也可以是员工,在这种情况下,员工数据将附加到用户。如果他不是雇员(他可能是外部专家),则不附加员工记录。如果User_IDEmployee中的FK和PK,则每个用户最多只能附加一个员工记录。如果User_ID只是FK而不是表Employee中的PK,则用户可以拥有多个相关的员工记录。

答案 1 :(得分:2)

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

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