← Назад к вопросам

Какие знаешь свойства первичного ключа?

1.6 Junior🔥 111 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Свойства первичного ключа

Первичный ключ (Primary Key, PK) — фундаментальное понятие в теории баз данных. Это один или несколько атрибутов, которые уникально идентифицируют каждую запись в таблице.

Основные свойства

Уникальность (Uniqueness)

  • Каждое значение первичного ключа должно быть уникальным
  • Невозможно иметь две записи с одинаковым значением ПК
  • Гарантирует идентификацию каждой строки
  • Пример: user_id = 123 есть только один раз в таблице Users

Неизменяемость (Immutability)

  • Значение первичного ключа не должно изменяться во время существования записи
  • Изменение ПК может привести к нарушению ссылочной целостности
  • Лучшая практика: использовать неизменяемые значения (ID, UUID, не email)

Недопущение NULL значений (Non-NULL)

  • Первичный ключ не может содержать NULL
  • Каждая запись должна иметь значение для ПК
  • Обеспечивает возможность однозначной идентификации
  • Это обязательное ограничение на уровне СУБД

Минимальность (Minimality)

  • ПК должен содержать минимум атрибутов для обеспечения уникальности
  • Простой ПК предпочтителен сложному, если возможно
  • Сложный ПК: (warehouse_id, product_id) для таблицы Inventory
  • Простой ПК: inventory_id — лучше

Типы первичных ключей

Простой первичный ключ (Simple Primary Key)

  • Состоит из одного атрибута
  • Примеры:
    • employee_id
    • user_id
    • order_id
  • Наиболее распространенный вариант

Составной первичный ключ (Composite Primary Key)

  • Состоит из двух или более атрибутов
  • Комбинация атрибутов обеспечивает уникальность
  • Примеры:
    • (course_id, student_id) в таблице Enrollments
    • (order_id, line_number) в таблице OrderItems
    • (warehouse_id, product_id) в таблице WarehouseStock

Естественный ключ (Natural Key)

  • Использует реальные данные предметной области
  • Примеры: email, социальный номер, номер паспорта
  • Может измениться со временем
  • Более хрупкий для использования

Суррогатный ключ (Surrogate Key)

  • Искусственный ключ, созданный только для идентификации
  • Не имеет бизнес-смысла
  • Примеры: AUTO_INCREMENT ID, UUID, GUID
  • Рекомендуется для большинства таблиц
  • Преимущества: стабильность, малый размер, независимость от данных

Требования к выбору первичного ключа

Неизменяемость данных (Stability)

  • Правильно: user_id = 1 (не изменится)
  • Неправильно: email = user@example.com (может изменить email)
  • Неправильно: phone_number (клиент может изменить телефон)

Минимальный размер (Minimal Size)

  • Меньший размер ПК = меньше места для индексов и внешних ключей
  • INTEGER (4 байта) меньше VARCHAR(255)
  • UUID (16 байт) vs AUTO_INCREMENT (4 байта)
  • Размер влияет на производительность индексов

Полнота (Completeness)

  • ПК должен охватывать все возможные способы идентификации записи
  • В M:N связях ПК часто включает оба ID: (id_a, id_b)

Совместимость с индексами (Index Compatibility)

  • ПК автоматически индексируется
  • Хорошие индексы улучшают производительность
  • UUID на больших таблицах может замедлить производительность

Использование в практике

Ссылочная целостность (Referential Integrity)

  • Внешние ключи ссылаются на первичные ключи других таблиц
  • Обеспечивает консистентность данных
  • DELETE с CASCADE зависит от определения ПК

Примеры из реальных систем

Таблица Users:

  • PK: user_id (UUID)
  • email (UNIQUE, но не ПК)

Таблица Orders:

  • PK: order_id (UUID)
  • FK: user_id (ссылается на Users.user_id)

Таблица OrderItems:

  • PK: (order_id, line_number) — составной ключ
  • FK: order_id (ссылается на Orders.order_id)
  • FK: product_id (ссылается на Products.product_id)

Таблица StudentCourses:

  • PK: (student_id, course_id) — составной ключ
  • FK: student_id (ссылается на Students.student_id)
  • FK: course_id (ссылается на Courses.course_id)

Ограничения и исключения

Когда NOT NULL может нарушиться

  • Неправильная конфигурация: PRIMARY KEY (column NULL)
  • СУБД предотвращает такую конфигурацию

Производительность UUID vs INTEGER

  • UUID: больше памяти, медленнее индексирование
  • INTEGER: меньше, быстрее, но ограничение на размер
  • Выбор зависит от масштаба системы

Заключение

Первичный ключ — основа целостности и эффективности базы данных. Правильный выбор ПК требует понимания требований приложения, характера данных и особенностей СУБД. Использование суррогатных ключей (UUID, AUTO_INCREMENT) обычно предпочтительнее естественных ключей для долгосрочной стабильности системы.

Какие знаешь свойства первичного ключа? | PrepBro