#mysql #database-design
#mysql #база данных-дизайн
Вопрос:
Есть две таблицы: EMPLOYEE и EMPLOYEE. Поскольку каждый СОТРУДНИК назначен одному РАБОТОДАТЕЛЮ, между ними существует соотношение 1: N — простая вещь. Но я также хочу иметь возможность моделировать ситуацию, когда каждый РАБОТОДАТЕЛЬ может выбрать своего одного любимого СОТРУДНИКА (с таким же успехом он мог бы не выбирать ни одного).
Итак, я должен:
1. Добавить вторую связь 1: 1 между этими таблицами — таким образом, EMPLOYEE также будет содержать EMPLOYEE_id_FK. Разрешено ли вообще иметь две связи между двумя таблицами?
2. Добавьте третью таблицу FAV, идентифицируемую двумя первичными уникальными ключами — EMPLOYER_ID и EMPLOYEE_ID? Таким образом, я был бы уверен, что у каждого работодателя может быть только один любимый сотрудник, а также каждый сотрудник может быть выбран в качестве избранного только одним сотрудником — это именно то, чего я хотел.
Как правильно это сделать?
Ответ №1:
Моя рекомендация — иметь четыре таблицы. Одна таблица employee, одна таблица employee, таблица для связи employee с employee (который говорит, что сотрудник не может работать на двух работодателей) и, наконец, таблица для связи employee с их любимым сотрудником.
РЕДАКТИРОВАТЬ: Да, конечно, между одними и теми же двумя таблицами могут быть две взаимосвязи.
Комментарии:
1. «между одними и теми же двумя таблицами может быть два отношения» — но для этого требуются переносимые ограничения внешнего ключа, которые недоступны в MySQL.
2. Не обязательно, вы можете сделать это с помощью «объединения таблиц», в основном, как я предложил в своем ответе. Для этого не требуется ничего особенного.
3. Ну, да, используя 3-ю таблицу. Но не только с двумя таблицами. 😉
4. Ха-ха, да, не только с двумя таблицами.
5. @Nik — можете ли вы описать таблицу, в которой будет храниться информация об этих любимых сотрудниках? В моем случае у работодателя может быть только один любимый сотрудник, а предпочтение сотруднику может отдавать только один работодатель (да, я знаю, это звучит глупо, но на самом деле речь идет не о сотрудниках и работодателях ..) — тогда, я полагаю, это должно выглядеть так: ИЗБРАННЫЙ (id_employer, id_employee, ОСНОВНОЙ (id_employer, id_employee), УНИКАЛЬНЫЙ (id_employer), УНИКАЛЬНЫЙ (id_employee). Имеет ли это смысл?
Ответ №2:
Вам нужно будет добавить дополнительную таблицу (т. Е. четыре таблицы вместо трех) или добавить какой-нибудь is_preferred
флаг в таблицу employer2employee).
Ответ №3:
Да, это разрешено. У вас может быть столько FK, сколько вам нравится.
кстати: Это соотношение 1: N, а не 1: 1. И когда я бы смоделировал это, это были бы отношения N: M, поскольку у одного сотрудника может быть более одного работодателя.
Ответ №4:
@Nik прав, у вас мог бы быть сотрудник с двумя работодателями, однако, я предполагаю, что у сотрудника может быть только один любимый, поэтому вам нужно только отношение FK, где Employee является основным для поля FavoriteEmp в Employee.
Комментарии:
1. Это правда, но это не очень хороший дизайн. Вы должны помнить о будущем. Возможно, работодатель хотел бы иметь двух любимых сотрудников в будущем, или любимый сотрудник превращается в просто действительно хороших сотрудников.
2. @Nik, я не могу с этим не согласиться, но в то же время ты не можешь быть бойскаутом в любой ситуации и быть готовым ко всему. У вас есть требования, и вы создаете лучший и наиболее эффективный дизайн, используя оба варианта для представления продукта, который удовлетворяет требованиям FRS.
3. Безусловно, но вряд ли это что-то действительно дополнительное.
4. Хорошо, для простоты я предположил, что у сотрудника может быть только один Emplyer. Но мой вопрос остается, можно ли выбрать favorite всего с двумя таблицами? Правильно ли это: EMPLOYEE (id (PK), id_fav_employee(FK) ) EMPLOYEE (id (PK) id_employee (FK) )
5. @Мэтт, нет, ты хочешь, чтобы у каждого сотрудника был любимый работодатель. Это дает вам Employee с минимальными полями Id, EmployerId, Name, FavoriteEmployerId. Таблица Employee с минимальными полями — Id, Name. FavoriteEmployerId и EmployerId будут иметь отношение FK к таблице Employer.