Много ко многим отношения с несколькими таблицами - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующие таблицы

Компания: Id, Имя

Лицо: Id, Имя

Компания может иметь одного или нескольких директоров.Директором может быть либо другая компания, либо человек.Чтобы связать их, у меня есть таблица Director:

Director: Id, CompanyId, DirectorCompanyId, PersonId

, где, если компания является директором, DirectorCompanyId имеет значение, а PersonId равен нулю или если Person являетсяPersonId для директора имеет значение, а DirectorCompanyId имеет значение null

Но я чувствую, что это неправильный дизайн.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Следующий дизайн соответствует требованиям

enter image description here

Другой вариант - использовать наследование:

Director <-- CompanyDirector
         <-- PersonDirector
0 голосов
/ 29 ноября 2018

Вы правы, это не правильный дизайн.Чтобы разбить отношение M: M на два отношения 1: M, вам нужна третья таблица:

CompanyPerson

--these columns are vital to decompose the many:many relationship
--the PK of this table should be a compound of these two columns
--so that the same person cannot twice work for the same company
--with different roles etc
PersonID -> FK to Person.ID
CompanyID -> FK to Company.ID

--plus other properties like:
RoleID -> FK to Role table --if roles are a defined set of options
StartDate -> --when the person began this employment
ManagerPersonId -> --the person's mananger.. etc

PersonID + CompanyID - составной первичный ключ для этой таблицы

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

Примечание. Вы можете назвать эту таблицу Employee, потому что это действительно люди из нее, но я склонен считать более полезным, что эти таблицы среднего уровня, которые создают ассоциации между двумя другими таблицами, лучше называтьTable1Table2, потому что вы можете более четко видеть / понимать взаимосвязь / цель таблицы, чем если бы она называлась чем-то более абстрактным, как Employee

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