2014-11-18 2 views
1

Я расширяю модель для приложения CRM.Наилучшее соотношение между одной и тремя другими таблицами

В существующей модели мы имеем эти таблицы:

  • Person р
  • Компания C
  • CompanyPerson ф (п: т)

Мы хотим создать новую таблицу с именем :

  • Отношения

Это может быть:

  • Person
  • Компания
  • Лицо, работающее в компании

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

  1. Сделать 3 обнуляемым FK-х в Relation и один из них должен быть не нулевым (в коде)
  2. Сделать 2 обнуляемым FK-х в Relation р и с и один или оба должны быть не равно нулю (в коде)
  3. Сделайте 3 новых п: м таблицы между Relation и эти таблицы (р, ​​с, ф)

Благодарности, Эверт-Ян

+2

Какая новая таблица должна быть хорошей? Странно, что «человек» - это «отношение». На первый взгляд, это не кажется хорошей моделью для чего-либо. –

+0

@Thorsten: Это для программы моделирования. Например, письмо должно быть привязано к отношению. И у вас есть бизнес и частные клиенты. –

ответ

1

Так повторно более или менее контакт - это либо частное отношение (контакт с лицом), либо компания или конкретное лицо в компании.

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

  • Person (id_person, Firstname, фамилия, ...)
  • Company (id_company, имя, ...)
  • CompanyPerson (id_person, id_company, работа, заработная плата, ...)
  • Связь (id_relation, id_person, id_company, letter, ...)

У вас были бы ограничения внешнего ключа для Лица, Компании и Компании, так что всякий раз, когда id_person заполняется, он должен находиться в таблице Person; всякий раз, когда id_company заполняется, он должен находиться в таблице Company; при каждом заполнении они должны находиться в таблице CompanyPerson.

Кроме того, вы должны добавить контрольное ограничение, чтобы гарантировать, что по крайней мере одно из двух полей заполняется для каждой записи Relation.

+0

Хорошо, что соответствует моему варианту 2, который я также считаю лучшим. Но как можно добавить «добавить контрольное ограничение, чтобы обеспечить заполнение хотя бы одного из двух полей для каждой записи отношений». ? –

+0

Это зависит от dbms. В Oracle, который будет «CHECK (id_person не равен null или id_company не является нулевым)», например. MySQL, как еще один пример, не знает контрольных ограничений. Здесь вы должны писать триггеры before-insert/update, которые генерируют ошибку, когда оба поля имеют нулевое значение. –

+0

Это решение использует MS Sql –

0

Другой идеей реализации может быть то, что люди называют polymorphic association. Ваша Relation таблица должна содержать 2 поля, как NOT NULL так:

Relation 
    - entity varchar(10) NOT NULL 
    - entity_id integer NOT NULL 

Когда это человек, то entity поле должно содержать строку Person и entity_id должен содержать внешний ключ к таблице Person.
Когда это компания, поле entity должно содержать строку Company, а entity_id должно содержать внешний ключ в таблице Company.

Затем вы можете абстрагировать это на свой код приложения.

+0

Как вы гарантируете целостность базы данных? –

Смежные вопросы