Создание отношения один-к-одному между таблицами с существующим отношением один-ко-многим - PullRequest
2 голосов
/ 19 марта 2012

Итак, в моей базе данных есть две таблицы:

Companies
--------------------
CompanyID (PK)
Name


Employees
--------------------
EmployeeID (PK)
CompanyID (FK)
Name

По сути, в одной компании много сотрудников.

Но я бы хотел, чтобы в каждой компании был ровно один сотрудник, которыйявляется основным контактом.Сначала я хотел добавить поле MainContactID в таблицу Companies, которое ссылается на EmployeeID в Employees, но это создаст цикл со связями.

Какой лучший способсделать это?

Ответы [ 5 ]

2 голосов
/ 19 марта 2012

Мы делаем что-то похожее с адресами, электронными письмами и телефонами.У нас есть поле, которое помечает запись как основную.Затем это поле поддерживается с помощью триггера, так что если основная точка контакта изменится, у вас останется только одна, а если основной контакт удален, триггер использует бизнес-правила, чтобы выяснить, какая оставшаяся запись получит флаг, поскольку мы должныиметь по крайней мере одну основную запись, если у нас есть какие-либо записи вообще.

2 голосов
/ 19 марта 2012

Нет ничего (на мой взгляд) не так с вашей первоначальной мыслью.

Хотя есть петля , как вы выразились, здесь нет проблем.

Наличие companies.MainContactEmployeeID обеспечивает наличие только одного такого контакта на компанию.

Затем добавление внешнего ключа Companies(CompanyID,MainContactEmployeeID): Employees(CompanyID,EmployeeID) гарантирует, что сотрудник действительно работает в этой компании. (Требуется также соответствующий уникальный индекс для таблицы Employee).

Такой внешний ключ возможен только из-за «цикла». Это, конечно, не проблема.

1 голос
/ 20 марта 2012

Если вы не хотите иметь

  • круговые пути в отношениях FK
  • Нули в столбцах FK

, вы можете использовать это:

Добавьте ограничение UNIQUE в Employee(CompanyID, EmployeeID) и создайте другую таблицу:

Company_MainContact
--------------------
CompanyID  (PK) (FK1-->Employee)
EmployeeID      (FK1-->Employee)
1 голос
/ 19 марта 2012

Я лично предпочитаю эту модель:

Organization
-------------
organization_id
name
other_columns

Person
-------------
person_id
name
other_columns

Person_Organization
--------------------
person_id
organization_id
begin_date
end_date
relationship_cd

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

0 голосов
/ 19 марта 2012

Создание таблицы с комбинированным первичным ключом, например:

Company_MainContact
--------------------
EmployeeID (PK) (FK-->Employee)
CompanyID (PK)  (FK-->Company)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...