Дизайн базы данных - нужно руководство
Я, вероятно, делаю это неправильно, но здесь это идет.
Я пытаюсь построить что-то вроде очень простой CRM. Я знаю, что их много, но на самом деле я хочу чему-то научиться. Я попытался найти готовые примеры для этого конкретного сценария, но все, что я нашел, это теоретические и упрощенные примеры, которые я не могу использовать.
Я могу сделать эту диаграмму более упрощенной, но в этом случае у меня будут пустые ячейки, так что в принципе я в курсе этого:)
Требования:
С некоторыми компаниями никогда не связывались прежде. Вот почему я создал две дополнительные таблицы
contact_emails
,company_emails
,contact_phones
,company_phones
,Связанная компания может назначить контакт (лицо).
Человек может иметь телефоны и электронную почту.
Один человек может быть назначен на несколько компаний
Одна компания может иметь несколько человек
Диаграмма:
]
Вопросы:
- Я на правильном пути?
- Что можно улучшить и как?
1 ответ
Вы не делаете это неправильно... много.;)
Ваше требование, что один человек может быть назначен нескольким компаниям, не реализовано в проекте. Чтобы включить это, удалите company_id
из контактов и добавьте:
company_contacts (company_id PK/FK, contact_id PK/FK)
В contact_phones
Я бы переименовал company_phones_id
столбец к phone_id
, чтобы соответствовать соглашению об именах, используемому в остальной части проекта.
Правильно ли, что у компании может быть только один телефон и электронная почта, кроме как через контакты? Если нет, проверьте показатели кардинальности по отношениям между companies
а также company_emails
/ company_phones
, Если это правильно, вы могли бы (я не говорю, должен) заменить company_emails
а также company_phones
таблицы с email_id
а также phone_id
колонны в компаниях.
Помимо этих проблем, схема выглядит приемлемой.
Есть еще одна поправка, которую я мог бы рассмотреть. Добавление супертипа для компаний и контактов (мы могли бы назвать их сторонами) позволит вам объединить company_phones
а также contact_phones
таблицы, а также company_emails
а также contact_emails
столы:
parties (id PK)
contacts (party_id PK/FK, name, surname)
companies (party_id PK/FK, company_name, ...)
party_phones (party_id PK/FK, phone_id PK/FK)
party_emails (party_id PK/FK, email_id PK/FK)
Тем не менее, в этом случае вы не можете установить разные кардинальности для компании и контактных телефонов / адресов электронной почты в базе данных.