Один или два первичных ключа для базы данных - PullRequest
1 голос
/ 14 января 2012

У меня есть два столбца в таблице, которые всегда будут уникальными, vendor_identifier и product_identifier. Оба они примерно одинаковой длины. Должен ли я добавить их оба в качестве первичных ключей, или только один, или какой-то вариант этого? Есть ли разница между добавлением одного или двух здесь?

Ответы [ 6 ]

1 голос
/ 14 января 2012

В MySql первичный ключ получает кластеризованный индекс, поэтому вы должны сделать первичный ключ уникальным идентификатором, который вы будете чаще всего запрашивать.(Это включает в себя объединения.)

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

1 голос
/ 14 января 2012

очереди запросов обоими ключами? или, может быть, один на тот момент?

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

но в основном все зависит от архитектуры вашего приложения / и схемы БД, которую вы выбираете использовать ...

0 голосов
/ 14 января 2012

Если предположить, что ваш vendor_identifier является внешним ключом, относящимся к таблице поставщиков, а product_identifier является внешним ключом, относящимся к таблице продуктов, я бы создал поле автономного номера (возможно, vendor_product_identifier?) В качестве основного ключа таблицы, которая содержит как vendor_id, так и product_id. Затем я бы поместил уникальный индекс в комбинацию vendor_id и product_id.

Итак, общая идея будет такой:

Vendor
------
vendor_identifier PK
name
phone
etc...

Product
-------
product_identifier PK
name
category
etc...

Vendor_Product
--------------
vendor_product_identifier //"AUTONUMBER PK"
vendor_identifier //"FK to Vendor, and part of COMBOINDEX1"
product_identifier //"FK to Vendor, and part of COMBOINDEX1"
etc...

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

0 голосов
/ 14 января 2012

, так как вы не описываете свои таблицы - я собираюсь предположить, что у вас действительно есть 3 таблицы здесь:

VENDOR
--------
vendor_id
other_cols

PRODUCT
---------
product_id
other_cols

VENDOR_PRODUCT
--------------
vendor_id
product_id
price-description-dates etc.

в этом случае - VENDOR_ID в таблице VENDOR - это PK. PRODUCT_ID в таблице PRODUCT - это PK (для этой таблицы)

VENDOR_ID в таблице VENDOR_PRODUCT является внешним ключом PRODUCT_ID в таблице VENDOR_PRODUCT является внешним ключом

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

0 голосов
/ 14 января 2012

Примите во внимание следующее:

(1) is the combination of vendor_id and product_id also guaranteed to be unique?
(2) will you always search with both vendor_id and product_id?

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

0 голосов
/ 14 января 2012

Вы можете иметь только один первичный ключ.Другой может быть УНИКАЛЬНЫМ ключом.

Какой бы вариант вы ни выбрали по умолчанию, ПЕРВИЧНЫЙ КЛЮЧ - ваш выбор .

Вам нужно спросить себя:

  • Будет ли таблица с обоими столбцами разрешать несколько продуктов?
  • Будет ли таблица с обоими столбцами разрешать несколько поставщиков?
  • Будет ли таблица с обоими столбцамиразрешить кортеж (поставщик, продукт) один или несколько раз?

Ответ на эти риторические вопросы поможет вам решить, имеет ли таблица одно из следующих значений в качестве ПЕРВИЧНОГО КЛЮЧА

  • vendor_identifier
  • product_identifier
  • vendor_identifier, product_identifier
...