Должен ли я добавить первичный ключ autoinc, чтобы получить первичный ключ?

У меня есть таблица, в которой нужно 2 поля. Один будет внешним ключом, другой не обязательно уникальным. На самом деле нет никакой причины, по которой я могу найти первичный ключ, кроме как прочитав, что «каждой отдельной таблице когда-либо нужен первичный ключ».

Редактировать:

Здесь есть несколько хороших мыслей.

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

Допустим, у вас есть таблица с типом продукта, количеством, стоимостью и производителем.

Тип продукта не всегда будет уникальным (например, MP3-плеер), но производитель / тип продукта будет уникальным (например, Apple MP3 Player). Забудьте о различных моделях, которые производители делают для этого примера. Для простоты в этой таблице есть автоинкрементный первичный ключ.

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

В настоящее время я изложил это во второй таблице, где FK указывает на основную таблицу, а во втором столбце указано общее количество «очков популярности», набранных этим элементом.

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

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


person Chris Sobolewski    schedule 05.11.2009    source источник
comment
но похоже, что я недостаточно нормализую свою базу данных. Если вы не выполняете назначение класса, не беспокойтесь об этом. Если вы можете выполнить то, что пытаетесь сделать, это нормально. В этом случае, если вы можете получить доступ к строкам однозначно (что можно сделать с помощью уникального внешнего ключа, предполагая только 1 строку на значение внешнего ключа), это не существенно.   -  person Cal    schedule 06.11.2009


Ответы (8)


Вы должны различать первичный ключ и суррогатный ключ. Автоинкрементный столбец - частный случай последнего. Таким образом, ваш вопрос двоякий:

  1. У каждой таблицы должен быть первичный ключ?
  2. Должна ли каждая таблица иметь суррогатный первичный ключ?

Ответ на первый вопрос: ДА, за исключением некоторых особых случаев (таблица ассоциаций для отношений «многие ко многим», возможно, является примером такого особого случая). Причина этого в том, что вам обычно нужно иметь возможность (если не сейчас, то в будущем) последовательно адресовать отдельные строки этой таблицы - например, для обновления / удаления.

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

Непонятно, какова функция вашей таблицы; из вашего описания это звучит так, как будто он имеет семантику «набор значений» (FK для «основной» таблицы + значение). Некоторые ORM не поддерживают суррогатные ключи в таких обстоятельствах; если это вызвало ваш вопрос, можно оставить суррогатный (или даже основной в случае сумки) ключ выключенным.

person ChssPly76    schedule 05.11.2009

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

Это также помогает прямой сопоставимости в случае, если в схеме будут изменения в будущем и два значения не будут уникальными. К тому же память сейчас намного дешевле, не стесняйтесь использовать ее в качестве инвестиций. ;)

person Trav L    schedule 05.11.2009

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

person Sabeen Malik    schedule 05.11.2009

Я бы сказал, что абсолютно необходимо иметь какой-то первичный ключ в каждой таблице.

Интересно, что один из администраторов баз данных для свойства Viacom однажды сказал мне, что на самом деле нет заметной разницы в использовании INT UNSIGNED или VARCHAR(n) в качестве первичного ключа в MySQL. Это относится к пользовательской таблице с более чем 64 миллионами строк. Я считаю, что n может быть достаточно большим (‹= 100), но я забываю, чем они ограничивались. К сожалению, у меня нет никаких эмпирических данных, подтверждающих это.

person Justin Johnson    schedule 05.11.2009

Вам НЕ ОБЯЗАТЕЛЬНО иметь первичный ключ для каждой таблицы, но рекомендуется иметь их, поскольку они почти всегда необходимы при проектировании нормализованной реляционной базы данных. Если вы обнаружите кучу таблиц, которые, по вашему мнению, не нуждаются в PK, вам следует пересмотреть дизайн / макет ваших таблиц. Дополнительную информацию о нормализации см. здесь.

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

person RC.    schedule 05.11.2009

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

person Keith Randall    schedule 05.11.2009

Строго говоря, суррогатный ключ не нужен, но нужен первичный ключ.

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

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

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

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

person Bill Karwin    schedule 05.11.2009

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

  • У вас есть ПК, не имеющий отношения к данным.
  • Вам никогда не нужно менять значение PK
  • Каждая строка автоматически получит уникальный идентификатор.
person Raj More    schedule 05.11.2009
comment
Все вышесказанное верно, но не отвечает на вопрос ОП. - person ChssPly76; 05.11.2009
comment
Наличие автоматически увеличивающегося числа не имеет отношения к номинализации. en.wikipedia.org/wiki/Database_normalization - person JeremyDWill; 05.11.2009