У меня есть таблица Producers
и таблица Products
, которые имеют вид:
Id
- int, первичный ключName
- нварчар
Производитель может нести несколько Продуктов, поэтому я собирался создать таблицу под названием ProducerDetails
:
ProducerId
- int, Внешний ключ дляProducers.Id
ProductId
- int, Внешний ключ дляProducts.Id
Затем я начал задавать себе вопросы, поэтому я решил спросить экспертов. Было бы лучше, если бы в базе данных был дополнительный Id
столбец (int, Primary key) в моей ProducerDetails
таблице? Или это не нужно?
Я использую SQL-Server 2008 R2, если это вообще что-то меняет.
РЕДАКТИРОВАТЬ - Я полагаю, что отношения между этими таблицами будут многие-многие, извините, я не прояснил это. Производитель может нести несколько типов продуктов, и один и тот же продукт может производиться несколькими разными производителями.
Я прошу прощения, если этот вопрос слишком прост, ссылочная целостность / дизайн базы данных не мой сильной стороной (хотя я пытаюсь улучшить это).
источник
id
поле в его таблице отношений?ProductId, ProducerId
это уникальная комбинация, я не вижу необходимости добавлять еще один искусственный ключ в таблицу Join. Согласовано? И я думаю, что, если я не пойму вопрос неправильно, OP даже не нужно использовать таблицу Join для этого варианта использования.Нет, нет смысла добавлять дополнительный «первичный ключ» в эту таблицу. Ваши соединения только когда-либо будут ссылаться
ProducerID
иProductID
, так что это просто мертвый вес. ИМХО.Хотя я согласен с @Shark, что объединяющая таблица здесь даже не нужна, если только вы не стараетесь никоим образом не изменять схему существующих таблиц.
Кроме того, я также думаю, что стоит назвать ваш основной идентификатор полностью (например,
Products.ProductID
вместоProducts.ID
), чтобы идентификатор последовательно назывался по всей схеме.источник
ProductID
). Одним из преимуществ является то, что когда вы видитеSometableID
, вы сразу знаете, к какой таблице это относится. Другое заключается в том, что вы можете использоватьProduct JOIN ProducerDetail USING(ProductID)
синтаксис вместо более длинногоProduct JOIN ProducerDetail ON Product.ID = ProducerDetail.ProductID
USING(ProductID)
это не доступно в SQL-Server, поэтому этот пункт не применяется.