|
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
|
|||
---|---|---|---|
#18+
Придуманный пример для иллюстрации вопроса Есть таблица людей (например сотрудников или студентов, или еще какого-либо круга людей) Код: sql 1. 2. 3. 4.
Есть таблица футбольных команд. Код: sql 1. 2. 3. 4.
Нужно связать эти две таблицы указав любимую команду у человека. При этом любимая команда может быть только одна. Допустим, болельщиков крайне мало (например, 1%) и у малого числа людей есть любимая команда . Какие варианты есть: Добавив в таблицу User поле FavoritTeamId. При этом можно сделать его nullable, а можно добавить фиктивную запись в таблицу Team и использовать её Id у пользователей без любимой команды. Добавив промежуточную таблицу Код: sql 1. 2. 3. 4.
Вопрос - как правильнее с точки зрения производительности и правильной архитектуры связать таблицы? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 01:32 |
|
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
|
|||
---|---|---|---|
#18+
Добавив в таблицу User поле FavoriteTeamId и сделав его nullable. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 01:54 |
|
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
|
|||
---|---|---|---|
#18+
softwarerДобавив в таблицу User поле FavoriteTeamId и сделав его nullable. Вариант с промежуточной таблицей тоже вполне жизнеспособен. Только на промежуточную таблицу надо дополнительное ограничение (уникальность UserId) наложить. Отношение "ноль или один ко многим" это будет тогда как частный случай "много ко многим", только с дополнительным ограничением. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 06:15 |
|
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
|
|||
---|---|---|---|
#18+
fkthatВариант с промежуточной таблицей тоже вполне жизнеспособен. Жизнеспособен. Но, с одной стороны, предпочтителен весьма редко и в ситуациях, когда таких вопросов обычно уже не задают. С другой стороны, если такая необходимость когда-нибудь нарисуется - материализуется из первого варианта буквально одним движением (скажем, в Oracle - достаточно просто создать индекс по этому полю, он по сути и будет такой "промежуточной таблицей"). С третьей - перейти в направлении от второго варианта к первому может быть достаточно сложно (добавление поля в гигантскую таблицу - то ещё удовольствие). Поэтому по умолчанию и в соответствии с уровнем вопроса я однозначно рекомендую первый вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 08:52 |
|
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
|
|||
---|---|---|---|
#18+
softwarer, Я, чесговоря тоже бы начал с более простого варианта, но другой бы в голове держал. Например, на случай, если к "люимой команде" надо будет добавлять какие-нибудь еще аттрибуты, напр. "с какого года она любимая", или ослабится ограничение и любимых команд может быть уже не одна а две. Очень похожая ситуация, это когда в таблице есть группа полей, которые всегда либо все null, либо все not null, например, люди и их паспортные данные, которые мы можем либо знать, либо не знать - хоть тут и соотношение 1 к 1, но все равно паспортные данные имеет смысл вынести в отдельную таблицу и привязать её к людям по внешнему ключу, который одновременно будет и первичный. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 09:33 |
|
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
|
|||
---|---|---|---|
#18+
fkthat, паспортные данные, как правило, стоит вынести в отдельную таблицу не потому, что они "одновременно null", а потому, что документ - это совершенно отдельная от человека сущность со своим жизненным циклом, и бизнес-логика наверняка потребует таких кейсов как "Иванова вышла замуж" или "Петрову неправильно вбили номер паспорта". Чем больше бизнес-логики ляжет на "любимую команду" - тем больше причин вынести её в отдельную сущность, но здесь уже прогноз не так однозначен, как с документами. Что же до самой по себе группы полей, то для реализации такого требования достаточно очевидного check constraint-а, применять что-либо более масштабное, имхо, не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 10:04 |
|
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
|
|||
---|---|---|---|
#18+
Третья таблица понадобится когда надо будет учитывать несколько любимых команд. Пока этого нет третью не надо. Все условия (какие появляются) вносить в таблицу "User". ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 11:09 |
|
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
|
|||
---|---|---|---|
#18+
KreatorXXIТретья таблица понадобится когда надо будет учитывать несколько любимых команд. Пока этого нет третью не надо. Все условия (какие появляются) вносить в таблицу "User". Даже если условий 47 штук? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 11:34 |
|
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
|
|||
---|---|---|---|
#18+
Читайте книШки, классиками все давно определено (Джексон - правила 4 и 5). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 14:14 |
|
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
|
|||
---|---|---|---|
#18+
softwarerДобавив в таблицу User поле FavoriteTeamId и сделав его nullable. softwarerЧем больше бизнес-логики ляжет на "любимую команду" - тем больше причин вынести её в отдельную сущность, но здесь уже прогноз не так однозначен, как с документами. Спасибо, всё встало на свои места. Пока что первый вариант действительно предпочтительнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.05.2019, 16:23 |
|
Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?
|
|||
---|---|---|---|
#18+
fkthatKreatorXXIТретья таблица понадобится когда надо будет учитывать несколько любимых команд. Пока этого нет третью не надо. Все условия (какие появляются) вносить в таблицу "User". Даже если условий 47 штук? :) Не, 47 штук перебор. С другой стороны, а что такого? Таблица "User" может быть очень широкой. Связь между таблицами "один к одному" для меня противоестественна. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.05.2019, 11:54 |
|
|
start [/forum/topic.php?fid=32&fpage=5&tid=1539931]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
54ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 259ms |
total: | 408ms |
0 / 0 |