powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
11 сообщений из 11, страница 1 из 1
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
    #39817416
Byte916
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Придуманный пример для иллюстрации вопроса

Есть таблица людей (например сотрудников или студентов, или еще какого-либо круга людей)
Код: sql
1.
2.
3.
4.
User
----
Id
Name



Есть таблица футбольных команд.
Код: sql
1.
2.
3.
4.
Team
----
Id
Name



Нужно связать эти две таблицы указав любимую команду у человека.
При этом любимая команда может быть только одна.
Допустим, болельщиков крайне мало (например, 1%) и у малого числа людей есть любимая команда .

Какие варианты есть:
Добавив в таблицу User поле FavoritTeamId. При этом можно сделать его nullable, а можно добавить фиктивную запись в таблицу Team и использовать её Id у пользователей без любимой команды.

Добавив промежуточную таблицу
Код: sql
1.
2.
3.
4.
TeamInUsers
----
UserId
TeamId



Вопрос - как правильнее с точки зрения производительности и правильной архитектуры связать таблицы?
...
Рейтинг: 0 / 0
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
    #39817418
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавив в таблицу User поле FavoriteTeamId и сделав его nullable.
...
Рейтинг: 0 / 0
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
    #39817436
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerДобавив в таблицу User поле FavoriteTeamId и сделав его nullable.
Вариант с промежуточной таблицей тоже вполне жизнеспособен. Только на промежуточную таблицу надо дополнительное ограничение (уникальность UserId) наложить. Отношение "ноль или один ко многим" это будет тогда как частный случай "много ко многим", только с дополнительным ограничением.
...
Рейтинг: 0 / 0
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
    #39817459
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatВариант с промежуточной таблицей тоже вполне жизнеспособен.
Жизнеспособен. Но, с одной стороны, предпочтителен весьма редко и в ситуациях, когда таких вопросов обычно уже не задают. С другой стороны, если такая необходимость когда-нибудь нарисуется - материализуется из первого варианта буквально одним движением (скажем, в Oracle - достаточно просто создать индекс по этому полю, он по сути и будет такой "промежуточной таблицей"). С третьей - перейти в направлении от второго варианта к первому может быть достаточно сложно (добавление поля в гигантскую таблицу - то ещё удовольствие). Поэтому по умолчанию и в соответствии с уровнем вопроса я однозначно рекомендую первый вариант.
...
Рейтинг: 0 / 0
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
    #39817485
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer,

Я, чесговоря тоже бы начал с более простого варианта, но другой бы в голове держал. Например, на случай, если к "люимой команде" надо будет добавлять какие-нибудь еще аттрибуты, напр. "с какого года она любимая", или ослабится ограничение и любимых команд может быть уже не одна а две. Очень похожая ситуация, это когда в таблице есть группа полей, которые всегда либо все null, либо все not null, например, люди и их паспортные данные, которые мы можем либо знать, либо не знать - хоть тут и соотношение 1 к 1, но все равно паспортные данные имеет смысл вынести в отдельную таблицу и привязать её к людям по внешнему ключу, который одновременно будет и первичный.
...
Рейтинг: 0 / 0
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
    #39817518
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,

паспортные данные, как правило, стоит вынести в отдельную таблицу не потому, что они "одновременно null", а потому, что документ - это совершенно отдельная от человека сущность со своим жизненным циклом, и бизнес-логика наверняка потребует таких кейсов как "Иванова вышла замуж" или "Петрову неправильно вбили номер паспорта". Чем больше бизнес-логики ляжет на "любимую команду" - тем больше причин вынести её в отдельную сущность, но здесь уже прогноз не так однозначен, как с документами.

Что же до самой по себе группы полей, то для реализации такого требования достаточно очевидного check constraint-а, применять что-либо более масштабное, имхо, не требуется.
...
Рейтинг: 0 / 0
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
    #39817606
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Третья таблица понадобится когда надо будет учитывать несколько любимых команд. Пока этого нет третью не надо. Все условия (какие появляются) вносить в таблицу "User".
...
Рейтинг: 0 / 0
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
    #39817636
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIТретья таблица понадобится когда надо будет учитывать несколько любимых команд. Пока этого нет третью не надо. Все условия (какие появляются) вносить в таблицу "User".
Даже если условий 47 штук? :)
...
Рейтинг: 0 / 0
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
    #39817780
ИВП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читайте книШки, классиками все давно определено (Джексон - правила 4 и 5).
...
Рейтинг: 0 / 0
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
    #39817877
Byte916
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerДобавив в таблицу User поле FavoriteTeamId и сделав его nullable.
softwarerЧем больше бизнес-логики ляжет на "любимую команду" - тем больше причин вынести её в отдельную сущность, но здесь уже прогноз не так однозначен, как с документами.

Спасибо, всё встало на свои места. Пока что первый вариант действительно предпочтительнее.
...
Рейтинг: 0 / 0
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
    #39818679
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatKreatorXXIТретья таблица понадобится когда надо будет учитывать несколько любимых команд. Пока этого нет третью не надо. Все условия (какие появляются) вносить в таблицу "User".
Даже если условий 47 штук? :)

Не, 47 штук перебор. С другой стороны, а что такого? Таблица "User" может быть очень широкой. Связь между таблицами "один к одному" для меня противоестественна.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]