Практика отношений таблиц SQL Server - PullRequest
4 голосов
/ 21 сентября 2010

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

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 21 сентября 2010

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

1 голос
/ 21 сентября 2010

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

0 голосов
/ 21 сентября 2010

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

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

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

0 голосов
/ 21 сентября 2010

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

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

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

0 голосов
/ 21 сентября 2010

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

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

Car: CarId, CustomerId, MakeId, ModelId, Color, PlateNumber, VIN
Customer: CustomerId, LastName, FirstName, MiddleName
...