MySQL InnoDB поддерживает два отношения между двумя таблицами - PullRequest
0 голосов
/ 31 мая 2018

Моя цель - иметь таблицу с именем emails и таблицу с именем accounts с двумя отдельными отношениями между ними.

  • Отношение один-ко-многим от accounts доemails, чтобы каждая учетная запись могла быть связана с некоторым количеством электронных писем.
  • Отношение "один к одному", чтобы каждая учетная запись была связана только с одним электронным письмом.

ЭтоПозволит моим пользователям добавлять несколько адресов электронной почты в свои учетные записи, но при этом установить, что одно из этих писем будет установлено в качестве «основного».

Попытка 1

Первое, что я попробовал, было следующее:

emails          accounts
---             ---

id              id
account         email
email

Для этой работы необходимы два внешних ключа:

emails ( account ) REFERENCES accounts ( id ) ON DELETE CASCADE
accounts ( id, email ) REFERENCES emails ( account, id )

Однако, поскольку MySQL не откладывает проверки внешнего ключа, это нене работает.

Попытка 2

Я пытался избежать таблиц, ссылающихся друг на друга, так как это портит внешние ключи в MySQL.Второе, что я попробовал, было следующее:

emails          accounts
---             ---

id              id
account
email
default

Для этого необходим только один внешний ключ:

emails ( account ) REFERENCES accounts ( id )

Но также этот индекс:

UNIQUE KEY emails ( account, default )

К сожалению, на самом деле это не отношение «один к одному», а отношение «один к нулю или один»: оно позволяет связывать учетные записи , а не с основным адресом электронной почты.

Попытка 3 ??

Как еще можно решить эту проблему?Я не очень знаком с триггерами ... это было бы подходящим решением здесь?Я никогда не использовал их много.Я всегда думал, что спусковые механизмы были грязными.Но я отвлекся.Я здесь спрашиваю мнение сообщества, потому что у меня нет идей, поэтому, возможно, мне нужно изменить свою мелодию на триггерах.

Спасибо всем заранее!

1 Ответ

0 голосов
/ 31 мая 2018

Если бы вам пришлось использовать внешние ключи, вы могли бы сделать столбец accounts.email FK обнуляемым.

Оставьте accounts.email NULL при создании новой учетной записи, пока не добавите хотя бы одно электронное письмо.Затем UPDATE accounts, когда вы будете готовы установить адрес электронной почты по умолчанию.

Другими словами, нет возможности делать циклические ссылки, кроме как сделать дополнительный шаг.

  1. Вставка в учетные записи
  2. Вставка в электронные письма
  3. Обновление учетных записей для установки электронной почты по умолчанию

Но, честно говоря, я почти не вижу баз данных MySQL, использующих ограничения внешнего ключа в реальном времени.мир приложений в компаниях, в которых я работал или посещал.Частично по причине сложности управления циклическими ссылками, но даже когда ссылки не являются циклическими, внешние ключи приводят к некоторым неудобствам, таким как поведение блокировки.

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