Практика отношений между таблицами SQL Server

Каков рекомендуемый способ в этой ситуации:

Customer ..* <-------------> 0..1 Car

Таким образом, есть таблица Customer и таблица Car, у Customer может быть ноль или один Car, Car может быть связан со многими таблицами Customer.

  • Должен ли я добавить столбец CarID, допускающий значение NULL, в Customer или
  • Должен ли я создать таблицу Customer_Car_Map, содержащую CustomerID и CarID

Я спрашиваю об этом, потому что не знаю, рекомендуется ли иметь внешний ключ, допускающий значение NULL?


person peter    schedule 21.09.2010    source источник
comment
Что это за бизнес? Как упомянул Ваш, отношения для системы регистрации другие: с Клиентом (1)-›(n) Автомобиль. А для арендного бизнеса вам нужны постоянные клиенты и сохранение истории аренды, у вас есть: Клиент (n)-›(n) Автомобиль.   -  person pascal    schedule 22.09.2010


Ответы (5)


Если вы на 100 % уверены, что у клиента никогда не будет больше одной машины, сделайте первое предложение. Если вы считаете, что есть хоть малейший шанс, что это когда-либо может превратиться в отношение «многие ко многим», выберите второй вариант сейчас, чтобы избавить себя от головной боли в будущем.

person Joe Stefanelli    schedule 21.09.2010
comment
Точно мой мыслительный процесс. - person Denis Valeev; 21.09.2010
comment
Я бы по-прежнему склонялся к много-ко-многим и использовал триггер для обеспечения немедленного выполнения бизнес-правила. Меньше работы, если бизнес-правила будут ослаблены в будущем. - person OMG Ponies; 21.09.2010

Я бы сделал первое решение, оно намного проще. В другом решении вам понадобится ключ или уникальное ограничение, чтобы гарантировать отсутствие нескольких автомобилей для одного пользователя. Если позже это станет разрешено, вам нужно будет внести изменения в схему с любым решением, поэтому выберите более простой вариант.

person D'Arcy Rittich    schedule 21.09.2010

Вы можете добавить этот столбец CarId в таблицу "Клиенты" только в том случае, если вы достаточно уверены, что после реализации вашего решения у "Клиентов" не будет много автомобилей.

Вы также можете иметь столько автомобилей, сколько хотите для любого конкретного Клиента, если вы сделаете это следующим образом:

Car: CarId, CustomerId, MakeId, ModelId, Color, PlateNumber, VIN
Customer: CustomerId, LastName, FirstName, MiddleName
person Denis Valeev    schedule 21.09.2010

Это уравновешивание, с одной стороны, идея не иметь нулей в базе данных.

Однако, если вы примете это правило как закреплённое в камне, вы можете получить массивные операторы соединения, которые в дальнейшем будет сложно поддерживать.

Если вы уверены, что это будет отношение один к одному, придерживайтесь только двух таблиц.

person Phil Hannent    schedule 21.09.2010

ИМХО отображение зависит от ситуации, которая должна быть представлена.

Например, если это национальный реестр автомобилей, то у одного человека может быть много автомобилей, но у одного автомобиля должен* быть один владелец. Хорошее представление для вашего первого решения — это когда мы хотим знать, в какую машину садится какой-то человек, потому что в этом случае очень сложно находиться в двух местах одновременно. Для общих случаев лучшим решением является «многие ко многим», и я бы выбрал это преимущество этого решения, заключающееся в том, что в ближайшем будущем один человек сможет иметь более одной машины.

*должен, потому что у одного автомобиля может быть два владельца.

person Damian Leszczyński - Vash    schedule 21.09.2010