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

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

Ответ

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

Тип ключа Назначение Особенности Пример SQL (MySQL/PostgreSQL)
Первичный ключ
(Primary Key, PK)
Уникально идентифицирует каждую запись в таблице. • Значения уникальны и не могут быть NULL.
• На одно поле или группу полей (составной ключ).
• На его основе часто строятся индексы.
```sql

CREATE TABLE Users ( user_id INT PRIMARY KEY, -- Простой PK email VARCHAR(100) UNIQUE NOT NULL );


| **Внешний ключ<br>(Foreign Key, FK)** | Создает **связь** между двумя таблицами. Ссылается на PK (или UNIQUE) другой таблицы. | • Обеспечивает **ссылочную целостность**: нельзя добавить запись с несуществующим в связанной таблице значением.<br>• Определяет поведение при удалении/обновлении (`ON DELETE CASCADE`, `RESTRICT`). | ```sql
CREATE TABLE Orders (
    order_id INT PRIMARY KEY,
    user_id INT, -- Поле для связи
    FOREIGN KEY (user_id) REFERENCES Users(user_id)
        ON DELETE CASCADE
);
``` |
| **Уникальный ключ<br>(Unique Key)** | Гарантирует **уникальность** значений в столбце (или группе столбцов). | • Отличается от PK тем, что допускает **одно значение NULL** (зависит от СУБД).<br>• В таблице может быть несколько уникальных ключей. | ```sql
ALTER TABLE Users ADD CONSTRAINT unique_email UNIQUE (email);
``` |
| **Составной ключ<br>(Composite Key)** | Первичный или уникальный ключ, состоящий из **двух и более столбцов**. | • Уникальность обеспечивается только **комбинацией** значений всех столбцов ключа. | ```sql
CREATE TABLE Enrollment (
    student_id INT,
    course_id INT,
    PRIMARY KEY (student_id, course_id) -- Составной PK
);
``` |

**Практический совет:** Выбор подходящего первичного ключа (суррогатный `AUTO_INCREMENT` vs. естественный) — важное решение при проектировании схемы БД.