MySQL несколько внешних ключей - PullRequest
1 голос
/ 09 декабря 2011

Я новичок в настройке реляционных баз данных.

Я пытаюсь создать две таблицы в MySQL, таблицу USER и таблицу COMPANY.Оба должны иметь возможность иметь несколько телефонных номеров, связанных с ними, поэтому я создал таблицу PHONE и хотел иметь отношение «один ко многим» от КОМПАНИИ до ТЕЛЕФОНА и от ПОЛЬЗОВАТЕЛЯ до ТЕЛЕФОНА.

Там толькоКажется, в том, что я пытаюсь сделать, есть два варианта:

  1. Хранить два внешних ключа в PHONE, один ссылающийся на COMPANY и один ссылающийся на USER.Они оба по умолчанию имеют значение NULL, и каждый, и при создании новой строки в PHONE, я бы заполнил только ту, которая мне нужна.

  2. Есть две разные таблицы, USER_PHONE и COMPANY_PHONE.

Ни один из вариантов не кажется мне оптимальным.Вариант 1 кажется хакерским и подверженным проблемам с избыточностью.Второй вариант кажется довольно повторяющимся и ненужным.Я склонен думать, что вариант 2 - это «официальный» способ действий (начинаю задумываться, почему именно поэтому я слышу негативные отзывы о MySQL).

Кто-нибудь?Спасибо,

-Matt

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Я хотел бы предложить следующий дизайн (так же, как ваш):

Прежде всего, у нас будет три стола

USER -- UserId, other fields
COMPANY -- CompanyId, other fields
PHONE -- PhoneId, PhoneNumber

Тогда есть две таблицы для хранения отношения

COMPANY_PHONE -- CompanyId, PhoneId
USER_PHONE -- UserId, PhoneId
1 голос
/ 13 декабря 2011

Наличие двух разных таблиц для телефонных номеров вызывает некоторые проблемы.

  • Вам нужно искать номер телефона в нескольких местах.
  • Если у человека и компании общий номер телефона, и номер телефона изменится, возможно, вызабудьте обновить его во всех таблицах.
  • Это нарушает Принцип Ортогонального Дизайна , что в широком смысле означает "Не иметь таблицы, значения которых перекрываются".

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

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