Вариант 3 является самым чистым. Это делает добавление и удаление любимой самой легкой. И это схема, которую будет реализовывать инфраструктура ORM.
Вариант 1 работоспособен, но вы не можете определить ограничение внешнего ключа для обеспечения целостности. Добавление предикатов WHERE type='Venue'
к вашим запросам делает работу с этой таблицей почти такой же, как работа с отдельной таблицей «Favorite_Venue».
Вариант 2 усложняет добавление избранного, если он уже существует. (Это потребует обновления существующей строки, а не вставки. Если у кого-то было два любимых места и пять любимых исполнителей, сколько строк было бы? Но можно было бы определить по крайней мере внешние ключи.
Скажем, у нас было два любимые места и два любимых исполнителей:.
userID venueID performerID
------ ------- -----------
1 11 177
1 NULL 654
1 12 NULL
Когда любимый venueID 11 удаляется, вы бы обновить строку, чтобы установить venueID в NULL Но если venueID 12 удаляется как любимца, вы бы установить столбец в NULL, или удалите строку.Когда вы пошли добавить любимого исполнителя, обновите ли вы существующую строку с номером исполнителя NULL или вставите строку. Неработоспособно, но это сложнее.
Если бы у нас было правило, в котором говорилось, что только один из столбцов locationID или performerID может быть заполнен, то использование предикатов, таких как WHERE venueID IS NOT NULL
, сделает работу с этой таблицей почти такой же, как работа с отдельной таблицей Favorite_Venue.
Нижняя линия, я бы выбрал вариант 3, если только не было какой-то веской причины не делать этого.
Это не «беспорядок». Каждая из этих таблиц Favorite_Venue и Favorite_Performer имеет цель, «raison d'etre», причина, по которой она есть. Каждая таблица разрешает отношения «многие ко многим».
Объединение этих двух отдельных таблиц «отношения» в одну таблицу фактически создает беспорядок. Если мы добавим столбец, чтобы различать строки (чтобы эффективно отвечать на вопрос, в какой таблице действительно входит эта строка), этот столбец «загромождает». Если мы используем два отдельных столбца в одной строке для двух отношений, это создает беспорядок в коде, который связан с добавлением или удалением избранных.
Спасибо, это именно то, что я искал. Мой босс не понравится «беспорядок», но теперь я могу хотя бы показать ему рассуждения! ;) –