Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
 Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?  [new]
Byte916
Member

Откуда:
Сообщений: 2
Придуманный пример для иллюстрации вопроса

Есть таблица людей (например сотрудников или студентов, или еще какого-либо круга людей)
User
----
Id
Name


Есть таблица футбольных команд.
Team
----
Id
Name


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

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


    Вопрос - как правильнее с точки зрения производительности и правильной архитектуры связать таблицы?
  • 24 май 19, 01:32    [21892589]     Ответить | Цитировать Сообщить модератору
     Re: Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?  [new]
    softwarer
    Member

    Откуда: 127.0.0.1
    Сообщений: 58486
    Блог
    Добавив в таблицу User поле FavoriteTeamId и сделав его nullable.
    24 май 19, 01:54    [21892592]     Ответить | Цитировать Сообщить модератору
     Re: Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?  [new]
    fkthat
    Member

    Откуда:
    Сообщений: 1163
    softwarer
    Добавив в таблицу User поле FavoriteTeamId и сделав его nullable.

    Вариант с промежуточной таблицей тоже вполне жизнеспособен. Только на промежуточную таблицу надо дополнительное ограничение (уникальность UserId) наложить. Отношение "ноль или один ко многим" это будет тогда как частный случай "много ко многим", только с дополнительным ограничением.
    24 май 19, 06:15    [21892618]     Ответить | Цитировать Сообщить модератору
     Re: Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?  [new]
    softwarer
    Member

    Откуда: 127.0.0.1
    Сообщений: 58486
    Блог
    fkthat
    Вариант с промежуточной таблицей тоже вполне жизнеспособен.

    Жизнеспособен. Но, с одной стороны, предпочтителен весьма редко и в ситуациях, когда таких вопросов обычно уже не задают. С другой стороны, если такая необходимость когда-нибудь нарисуется - материализуется из первого варианта буквально одним движением (скажем, в Oracle - достаточно просто создать индекс по этому полю, он по сути и будет такой "промежуточной таблицей"). С третьей - перейти в направлении от второго варианта к первому может быть достаточно сложно (добавление поля в гигантскую таблицу - то ещё удовольствие). Поэтому по умолчанию и в соответствии с уровнем вопроса я однозначно рекомендую первый вариант.
    24 май 19, 08:52    [21892666]     Ответить | Цитировать Сообщить модератору
     Re: Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?  [new]
    fkthat
    Member

    Откуда:
    Сообщений: 1163
    softwarer,

    Я, чесговоря тоже бы начал с более простого варианта, но другой бы в голове держал. Например, на случай, если к "люимой команде" надо будет добавлять какие-нибудь еще аттрибуты, напр. "с какого года она любимая", или ослабится ограничение и любимых команд может быть уже не одна а две. Очень похожая ситуация, это когда в таблице есть группа полей, которые всегда либо все null, либо все not null, например, люди и их паспортные данные, которые мы можем либо знать, либо не знать - хоть тут и соотношение 1 к 1, но все равно паспортные данные имеет смысл вынести в отдельную таблицу и привязать её к людям по внешнему ключу, который одновременно будет и первичный.
    24 май 19, 09:33    [21892723]     Ответить | Цитировать Сообщить модератору
     Re: Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?  [new]
    softwarer
    Member

    Откуда: 127.0.0.1
    Сообщений: 58486
    Блог
    fkthat,

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

    Что же до самой по себе группы полей, то для реализации такого требования достаточно очевидного check constraint-а, применять что-либо более масштабное, имхо, не требуется.
    24 май 19, 10:04    [21892775]     Ответить | Цитировать Сообщить модератору
     Re: Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?  [new]
    KreatorXXI
    Member

    Откуда: Москва
    Сообщений: 783
    Третья таблица понадобится когда надо будет учитывать несколько любимых команд. Пока этого нет третью не надо. Все условия (какие появляются) вносить в таблицу "User".
    24 май 19, 11:09    [21892912]     Ответить | Цитировать Сообщить модератору
     Re: Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?  [new]
    fkthat
    Member

    Откуда:
    Сообщений: 1163
    KreatorXXI
    Третья таблица понадобится когда надо будет учитывать несколько любимых команд. Пока этого нет третью не надо. Все условия (какие появляются) вносить в таблицу "User".

    Даже если условий 47 штук? :)
    24 май 19, 11:34    [21892952]     Ответить | Цитировать Сообщить модератору
     Re: Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?  [new]
    ИВП
    Member

    Откуда:
    Сообщений: 220
    Читайте книШки, классиками все давно определено (Джексон - правила 4 и 5).
    24 май 19, 14:14    [21893147]     Ответить | Цитировать Сообщить модератору
     Re: Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?  [new]
    Byte916
    Member

    Откуда:
    Сообщений: 2
    softwarer
    Добавив в таблицу User поле FavoriteTeamId и сделав его nullable.

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


    Спасибо, всё встало на свои места. Пока что первый вариант действительно предпочтительнее.
    24 май 19, 16:23    [21893281]     Ответить | Цитировать Сообщить модератору
     Re: Как лучше всего связать таблицы связью 1 ко многим при малом количестве связанных записей?  [new]
    KreatorXXI
    Member

    Откуда: Москва
    Сообщений: 783
    fkthat
    KreatorXXI
    Третья таблица понадобится когда надо будет учитывать несколько любимых команд. Пока этого нет третью не надо. Все условия (какие появляются) вносить в таблицу "User".

    Даже если условий 47 штук? :)


    Не, 47 штук перебор. С другой стороны, а что такого? Таблица "User" может быть очень широкой. Связь между таблицами "один к одному" для меня противоестественна.
    27 май 19, 11:54    [21894586]     Ответить | Цитировать Сообщить модератору
    Все форумы / Проектирование БД Ответить