Может ли атрибут базы данных быть первичным и внешним ключом? - PullRequest
6 голосов
/ 12 февраля 2012

У меня есть 2 таблицы, User и Employee. Каждому пользователю присваивается User_ID, и это первичный ключ в таблице User и внешний ключ в таблице Employee. Может ли этот атрибут в таблице Employee быть также первичным ключом?

Ответы [ 2 ]

23 голосов
/ 12 февраля 2012

Если между двумя таблицами существует взаимно-однозначное отношение, то первичным ключом таблицы сведений также является внешний ключ.

 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. |
+----------+                     +----------+

В этом случае ограничения первичного ключа и внешнего ключа устанавливаются для разных столбцов. В качестве альтернативы вы также можете создать первичный ключ с двумя внешними ключами плюс один числитель или другой различающий атрибут.


В вашем случае, если существует отношение один к одному или один к нулю или один между User и Employee, тогда да, User_ID в таблице Employee может быть внешним ключом (FK) и первичным ключом (PK) одновременно. Словом, это будет означать: пользователь также может быть сотрудником, и в этом случае данные сотрудника будут привязаны к пользователю. Если он не является сотрудником (он может быть внешним экспертом), запись о сотруднике не прилагается. Если User_ID - это FK и PK в Employee, к каждому пользователю может быть прикреплена не более одной записи сотрудника. Если User_ID был только FK, но не PK в таблице Employee, то у пользователя может быть несколько связанных записей о сотрудниках.

2 голосов
/ 12 февраля 2012

Да. Это можно сделать, например, если вы хотите, чтобы все сотрудники были пользователями, а некоторые пользователи могли быть сотрудниками. Это будет (ноль или один) к одному отношению.

В противном случае у вас обычно не было бы первичного ключа, такого же, как у внешнего ключа, хотя он мог бы содержать внешний (ие) ключ (и), как в случае таблицы соединений для отношения многие ко многим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...