Какие виды ключей существуют в реляционных базах данных?

«Какие виды ключей существуют в реляционных базах данных?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В реляционных БД ключи — это фундаментальное понятие для обеспечения целостности данных и связей. Вот основные типы:

  1. Первичный ключ (Primary Key, PK): Уникально идентифицирует каждую запись в таблице. Не может содержать NULL. Часто это автоинкрементный id.

    CREATE TABLE users (
        id INT AUTO_INCREMENT PRIMARY KEY, -- Первичный ключ
        email VARCHAR(255) NOT NULL
    );
  2. Внешний ключ (Foreign Key, FK): Создает ссылку на первичный ключ в другой таблице, обеспечивая ссылочную целостность. При удалении родительской записи можно задать поведение (CASCADE, SET NULL, RESTRICT).

    CREATE TABLE orders (
        id INT PRIMARY KEY,
        user_id INT NOT NULL,
        FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
    );
  3. Уникальный ключ (Unique Key): Гарантирует, что все значения в столбце (или комбинации столбцов) уникальны. В отличие от PK, допускает один NULL (зависит от СУБД).

    ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email);
  4. Составной (композитный) ключ: Первичный или уникальный ключ, состоящий из двух и более столбцов. Уникальность определяется комбинацией значений.

    CREATE TABLE user_roles (
        user_id INT,
        role_id INT,
        PRIMARY KEY (user_id, role_id), -- Составной первичный ключ
        FOREIGN KEY (user_id) REFERENCES users(id),
        FOREIGN KEY (role_id) REFERENCES roles(id)
    );
  5. Кандидатный ключ (Candidate Key): Это любой столбец или набор столбцов, которые могли бы быть выбраны в качестве первичного ключа, так как они уникальны и не содержат NULL. Из кандидатных ключей выбирается один первичный.

  6. Суперключ (Super Key): Набор столбцов, который однозначно идентифицирует запись. Он может содержать избыточные столбцы. Любой первичный ключ является суперключом, но не наоборот.

На практике чаще всего работаю с PRIMARY KEY, FOREIGN KEY и UNIQUE. Составные ключи полезны для связующих таблиц many-to-many. Правильный выбор ключей напрямую влияет на производительность запросов и целостность данных.