Должна ли каждая таблица MySQL иметь автоинкрементный первичный ключ? - PullRequest
5 голосов
/ 08 сентября 2011
  • Я понимаю значение первичных ключей.
  • Я понимаю значение индексов.

Должна ли каждая таблица MySQL иметь автоинкрементный первичный ключ (в идеале с типом поля INT)?

Обновить

@ Raj More'sОтвет кажется наиболее эффективным.Однако, когда я думаю об этом, возникает вопрос, как этот автоматически увеличенный идентификатор первичного ключа будет связан с другими таблицами.Например:

таблица 1

ID  |   firstname  |   lastname | email
----------------------------------------
1   |    john      |   doe      | 1@email.com
2   |    sarah     |   stow     | 2@email.com
3   |    mike      |   bro      | 3@email.com

таблица 2

ID  | memberid |    display      |    address
--------------------------------------------
1   |    1     | funtime zone    |   123 street
2   |    3     | silly place llc |  944 villa dr 

В приведенном выше примере потребитель может зайти на сайт и выбрать бесплатную регистрациютовар / услуга.Если потребитель выбирает, он может предоставить дополнительную информацию (хранящуюся в таблице 2) для дополнительной рассылки и т. Д. Я вижу проблему в том, как эти таблицы относятся к «автоинкрементному полю первичного ключа».В таблице 2 'memberid' относится к идентификатору таблицы 1, но это не очень ясно.Любая новая информация, помещенная в таблицу 2, будет увеличиваться на 1, тогда как не все потребители будут выбирать для участия в таблице 2 необходимые данные.

Ответы [ 3 ]

6 голосов
/ 08 сентября 2011

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

Я бы сказал Нет .

Прочтите этот ответ: суррогатные против натуральных бизнес-ключей


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

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

Поскольку ОП обновил вопрос, я постараюсь прокомментировать эту конкретную тему.

Я думаю, что это как раз тот случай, когда автоинкрементный первичный ключ не только бесполезен, но и добавляет отрицательное значение. Предположим, что table1 и table2 находятся в отношениях 1:1, memberid может быть как Primary Key, так и Foreign Key до table1.

Добавление столбца идентификатора с автоинкрементом добавляет один индекс и, если он кластеризован (например, индексы PK InnoDB), увеличивает размер индекса memberid. Более того, если у вас есть такой автоинкрементный идентификатор, некоторое соединение таблицы 2 с другими таблицами должно быть выполнено с использованием этого id (соединения с таблицами в 1:n отношении к таблице 2), а некоторые с использованием memberid ( СОЕДИНЕНИЯ к таблицам в 1:n отношении table1). Если у вас есть только memberid, оба этих типа могут быть сделано с помощью memberid.

3 голосов
/ 08 сентября 2011

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

Я бы сказал Да .

Прочтите этот ответ Суррогатные и натуральные / деловые ключи

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

Я изменю свой ответ, включив в него следующее:

В некоторых случаях я использую фактическое значение в качестве суррогатного ключа:

DimDate (20151031, 20151101, 20151102....) DimZipCode (10001, 10002, 10003...)

Все остальное получает суррогатные ключи.

1 голос
/ 08 сентября 2011

Да, с одним исключением:

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

Как только таблица ссылок получает дополнительную информацию, ей требуется простой первичный ключ с одним полем.

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

РЕДАКТИРОВАТЬ: добавлено больше в предыдущем предложении.

...