Первичный ключ SQL-это необходимо?


У меня есть список предметов. Большинство из этих предметов не будет на складе. Таблица товаров имеет идентификатор, имя, описание. Количество товаров хранится в другой таблице, которая называется "запасы". Таблица запасов содержит item_id и количество товаров, находящихся на складе.

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

Edit: спасибо всем за то, что вы очень информативны. Я буду теперь всегда иметь первичные ключи, за исключением очень редких исключений. Я также узнал немного больше о последовательных и составных ключах.

5 2

5 ответов:

Всегда стремитесь иметь первичный ключ.

Если вы не уверены, есть первичный ключ.

Даже если вы на 99,99% уверены, что он вам не понадобится, возьмите его. Требования меняются, как я узнал из многолетнего опыта.

Единственные примеры, которые я действительно могу придумать,-это таблицы "многие ко многим" с двумя внешними ключами и мега-огромные (сотни миллионов строк) таблицы, где каждый байт имеет значение. Но даже тогда отдельный, уникальный, не имеющий значения для бизнеса ключ id все еще сильно рекомендуемый.

Есть еще кое-какая отличная информация об этом here:
http://weblogs.sqlteam.com/jeffs/archive/2007/08/23/composite_primary_keys.aspx

И здесь:
http://www.techrepublic.com/article/the-great-primary-key-debate/1045050
here:
http://databases.aspfaq.com/database/what-should-i-choose-for-my-primary-key.html
а здесь:
должен ли я использовать составные первичные ключи или нет?

В вашем примере я определенно, у него будет один.

Решение "не иметь" его должно основываться на очень четкой потребности и понимании, а также на фактических или прогнозируемых (например, объемных) проблемах с его наличием.

Один прекрасный пример этой потребности возникает при отладке и устранении неполадок. Так же, как создание и обновление столбцов в каждой таблице (еще один мой любимый), эта информация может изначально не использоваться/для переднего плана, но она может быть полезна для отслеживания и решения проблем. (кстати обновления штампов являются часто теперь стандарт в таких фреймворках, как Ruby On Rails , который также хорошо работает с соглашением каждой таблицы, имеющей поле id!)

В общем случае: каждая таблица должна иметь PK. По крайней мере, каждая таблица должна иметь некоторый кластерный индекс. PK не должен быть одним специальным столбцом, но наличие строк без уникальной идентификации в системе (СУБД) не является хорошей практикой.

Может быть несколько случаев, когда PK не требуется, но это исключения в правиле.

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

EDIT: как отмечали другие, как правило, если у вас нет веской причины для первичного ключа, вам будет полезно посмотреть на структуру таблицы, чтобы увидеть, можно ли объединить ее с другой таблицей, в данном случае, вероятно, с таблицей элементов. Я вижу случаи. где это не вариант (например, что вы не можете изменить схему, просто добавьте новые таблицы), но это стоит посмотреть.

Нужен ли мне первичный ключ для таблицы инвентаризации?

Можем ли мы предположить, что данные являются реляционными? Отношение не имеет повторяющихся кортежей по определению. SQL позволяет дублировать строки в таблице. Таким образом, чтобы гарантировать отсутствие повторяющихся строк на практике, каждая таблица должна иметь по крайней мере одно уникальное ограничение. Короче говоря, у вас должна быть веская причина не устанавливать уникальное ограничение на каждый ключ-кандидат в таблице. По определению, нулевой или один ключ-кандидат может быть обозначается как "первичный", и какой из них (если таковой имеется) должен получить это обозначение, является произвольным.

Должен ли я использовать последовательный или составной ключ?

Я думаю, что это опечатка. Одностолбцовый ключ известен как" простой ключ", а не"последовательный ключ". Из вашего описания следует, что в инвентарной таблице есть единственный ключ кандидата-кандидата на item_ID which is a simple key. Единственным возможным составным ключом является суперкей, и, если на него не ссылается внешний ключ, он не должен быть ограничен с помощью уникального ключа. ограничение.

Когда допустимо, чтобы таблица не имела первичного ключа?

, Когда все ключи-кандидаты были ограничены с помощью ограничений UNIQUE или когда таблица не предназначена для хранения реляционных данных.

Если у вас есть только одна строка инвентаря на единицу-тогда это будет намного дешевле (средний-CPU и IO), что он будет в той же таблице элементов,

Если нет-это зависит от обстоятельств. И это будут вовсе не нормализованные данные

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