Подтвердить что ты не робот

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

Должен ли я всегда иметь первичный ключ в моих таблицах базы данных?

Возьмем тег SO. Вы можете увидеть тег в любой редакции, скорее всего, в таблице tag_rev с номером postID и номером ревизии. Мне нужен ПК для этого?

Кроме того, поскольку он находится в таблице rev и в настоящее время не используется, теги должны быть блобом tagID вместо нескольких записей нескольких папок post_id tagid?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

См. этот связанный вопрос о том, требуется ли целочисленный первичный ключ. Один из ответов использует тегирование в качестве примера:

Есть ли веские причины иметь таблицу базы данных без цельного первичного ключа

Для более подробного обсуждения тегов и ключей см. этот вопрос:

Идентификатор для тегов в системах тегов

Ответ 4

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

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

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

Ответ 5

Из раздела Справочного руководства MySQL 5.5 13.1.17:

Если у вас нет PRIMARY KEY, и приложение запрашивает PRIMARY KEY в ваших таблицах, MySQL возвращает первый индекс UNIQUE, который не имеет столбцов NULL в качестве первичного ключа.

Итак, технически, ответ - нет. Однако, как заявили другие, в большинстве случаев это весьма полезно.

Ответ 6

Я твердо верю, что каждая таблица должна иметь возможность однозначно идентифицировать запись. Для 99% таблиц это первичный ключ. В остальном вы можете уйти с уникальным индексом (я думаю, что таблицы с одним столбцом смотрят таблицы типов). Каждый раз, когда мне приходилось работать со столом без возможности однозначно идентифицировать записи, возникли проблемы.

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

Ответ 7

Если ПК не существует, как вы будете обновлять или удалять одну строку? Это было бы невозможно! Честно говоря, я использовал несколько таблиц без ПК, например, для хранения журналов активности, но даже в этом случае желательно иметь один, поскольку временные метки не могут быть достаточно гранулярными. Еще один пример - временные таблицы. Но в соответствии с реляционной теорией ПК является обязательным.

Ответ 8

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

Ответ 9

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

Примечание: это не отвечает тон "Grand Unified Theory" вашего вопроса, но я просто говорю, что на практике иногда вы ДОЛЖНЫ сделать первичный ключ для каждой таблицы.

Ответ 10

Если это таблица соединений, я бы не сказал, что вам нужен первичный ключ. Предположим, например, что у вас есть таблицы PERSONS, SICKPEOPLE и ILLNESSES. Таблица ILLNESSES имеет такие вещи, как грипп, холод и т.д., Каждый с первичным ключом. У ПЕРСОНА есть обычный материал о людях, каждый из которых также имеет первичный ключ. В таблице SICKPEOPLE есть только люди, которые болеют, и у него есть два столбца: PERSONID и ILLNESSID, внешние ключи обратно в соответствующие таблицы и первичный ключ. Таблицы PERSONS и ILLNESSES содержат сущности и сущности, которые получают первичные ключи. Записи в таблице SICKPEOPLE не являются сущностями и не получают первичных ключей.

Ответ 11

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

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

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

Опубликовать запись в блоге Cyberherbalist по основным ключам