Задать вопрос
byte916
@byte916

Как правильно связать две таблицы, если признак первой таблицы не всегда нужен в признаке второй таблицы?

Пример взят из головы, реальная задача иная, но схожая.

Допустим есть таблица людей и машин.
Люди
----
Id
Имя

Машины
----
Id
Марка


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

МашиныУЛюдей
----
CarId
PersonId


Всё на первый взгляд просто - если машина одна, то поле, если несколько - таблица.

Но если машина исключительно одна и мало кто владеет ими? Добавлять лишнее поле нецелесообразно (размер вырастет, длинна каждой записи увеличится), а промежуточная таблица может плохо сказаться на производительности. Или разницы нет?? А если машина менее чем у 1% людей? А если у 10%?

Есть какие-нибудь общие практики и рекомендации что лучше выбрать?
  • Вопрос задан
  • 333 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
sim3x
@sim3x
Машина может принадлежать нескольким людям
M2M - many to many - промежуточная таблица

Машина принадлежит только одному и она в каком-то роде уникальна
O2O - one to one - foreign key в таблице Машина или в таблице Человек

Если нужно указать у человека марку его единственной машины и машины не различаются
O2M - one to many - FK в таблице Человек

Пишите название таблиц в единстввеном числе

На производительности оба решения никак не сказываются

Запретите себе думать о производительности пока у вас нет нагрузки и схема находится в 3NF
Ответ написан
tsklab
@tsklab
Здесь отвечаю на вопросы.
Таблица "Персона" (код, наименование), таблица "Машина" (код, номер, марка), таблица "Марка" (код, наименование), таблица "Владение" (код, владелец, машина, эксклюзив).
Ответ написан
Комментировать
@ddd329
В таблицу машин добавь поле PersonId. Связь будет один ко многим, т.е. один человек и ноль и более машин. Если у одной машины несколько хозяев, тогда создавай промежуточную таблицу, и связь уже будет многие ко многим.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы