Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Типы ключей в SQL
Определение
Ключ — это атрибут или комбинация атрибутов, которые уникально идентифицируют запись в таблице или устанавливают связь между таблицами. Ключи — фундамент нормализации БД и обеспечивают целостность данных.
1. Primary Key (Первичный ключ)
Определение: Уникально идентифицирует каждую строку в таблице. В таблице может быть только один primary key.
Характеристики:
- Не может содержать NULL значения
- Каждое значение уникально
- Часто используется для связей с другими таблицами
- СУБД автоматически создаёт индекс на primary key
CREATE TABLE users (
user_id INT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100)
);
-- Или альтернативный синтаксис
CREATE TABLE orders (
order_id INT,
user_id INT,
order_date DATE,
PRIMARY KEY (order_id)
);
-- Composite Primary Key (составной первичный ключ)
CREATE TABLE course_enrollments (
student_id INT,
course_id INT,
enrollment_date DATE,
PRIMARY KEY (student_id, course_id)
);
2. Foreign Key (Внешний ключ)
Определение: Атрибут в одной таблице, который ссылается на primary key в другой таблице. Используется для связи таблиц.
Назначение:
- Обеспечивает referential integrity (целостность ссылок)
- Предотвращает удаление или изменение записей, на которые ссылаются другие таблицы
- Дефинирует связи между таблицами (1:N, M:N)
CREATE TABLE users (
user_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
-- Каскадное удаление
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE
);
-- Каскадное обновление
CREATE TABLE order_items (
item_id INT PRIMARY KEY,
order_id INT,
product_id INT,
FOREIGN KEY (order_id) REFERENCES orders(order_id) ON UPDATE CASCADE
);
Опции действий при удалении/обновлении:
- CASCADE — удалить/обновить связанные записи
- SET NULL — установить NULL в FK поле
- RESTRICT — запретить удаление (по умолчанию)
- NO ACTION — аналог RESTRICT
- SET DEFAULT — установить значение по умолчанию
3. Unique Key (Уникальный ключ)
Определение: Атрибут или комбинация атрибутов, которые должны быть уникальны, но могут отличаться от primary key.
Различия от Primary Key:
- Может быть несколько unique keys в таблице (только один primary key)
- Может содержать NULL значения (в большинстве СУБД)
- Не обязателен для связей с другими таблицами
CREATE TABLE users (
user_id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE NOT NULL,
username VARCHAR(50) UNIQUE,
phone_number VARCHAR(20) UNIQUE
);
-- Составной уникальный ключ
CREATE TABLE inventory (
inventory_id INT PRIMARY KEY,
warehouse_id INT,
product_id INT,
quantity INT,
UNIQUE (warehouse_id, product_id) -- один продукт не может быть дважды в одном складе
);
4. Candidate Key (Кандидат на первичный ключ)
Определение: Атрибут или комбинация атрибутов, которые могут быть выбраны в качестве primary key, но не выбраны.
Пример:
CREATE TABLE employees (
employee_id INT PRIMARY KEY, -- выбран как PK
email VARCHAR(100) UNIQUE, -- candidate key 1
employee_number VARCHAR(20), -- candidate key 2
ssn VARCHAR(20) UNIQUE -- candidate key 3 (SSN - номер соцстраха)
);
-- Любой из этих атрибутов мог быть primary key
-- но выбран employee_id
5. Super Key (Супер-ключ)
Определение: Набор атрибутов, который уникально идентифицирует запись. Может содержать дополнительные атрибуты.
Пример:
CREATE TABLE students (
student_id INT,
email VARCHAR(100),
name VARCHAR(100)
);
-- Супер-ключи:
-- {student_id} — минимальный
-- {student_id, email} — излишний
-- {student_id, email, name} — излишний
-- {email} — если email уникален
6. Alternate Key (Альтернативный ключ)
Определение: Candidate key, который не был выбран в качестве primary key.
-- Из примера выше:
-- email, employee_number, ssn — альтернативные ключи
-- (они могли быть PK, но вместо них выбран employee_id)
7. Artificial/Surrogate Key (Искусственный ключ)
Определение: Автогенерируемый ключ, не имеющий бизнес-смысла. Используется для удобства и производительности.
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT, -- искусственный ключ
ean_code VARCHAR(20) UNIQUE, -- естественный ключ
name VARCHAR(100),
price DECIMAL(10,2)
);
-- В PostgreSQL
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
ean_code VARCHAR(20) UNIQUE NOT NULL,
name VARCHAR(100),
price DECIMAL(10,2)
);
-- Или более современный способ
CREATE TABLE products (
product_id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
ean_code VARCHAR(20) UNIQUE NOT NULL,
name VARCHAR(100),
price DECIMAL(10,2)
);
8. Natural Key (Естественный ключ)
Определение: Ключ, состоящий из атрибутов, имеющих реальное бизнес-значение.
CREATE TABLE countries (
country_code CHAR(2) PRIMARY KEY, -- ISO 3166-1 alpha-2
country_name VARCHAR(100),
region VARCHAR(50)
);
-- country_code — естественный ключ (код страны имеет бизнес-смысл)
CREATE TABLE currency_rates (
currency_code CHAR(3), -- ISO 4217
date DATE,
exchange_rate DECIMAL(10,4),
PRIMARY KEY (currency_code, date)
);
9. Composite Key (Составной ключ)
Определение: Primary key, состоящий из двух или более атрибутов.
CREATE TABLE sales (
product_id INT,
warehouse_id INT,
date DATE,
quantity INT,
revenue DECIMAL(12,2),
PRIMARY KEY (product_id, warehouse_id, date)
);
-- Каждая комбинация product_id + warehouse_id + date должна быть уникальна
Сравнительная таблица
| Тип ключа | Уникальность | Может быть NULL | Может быть несколько | Назначение |
|---|---|---|---|---|
| Primary Key | Да | Нет | 1 | Основной идентификатор |
| Foreign Key | Нет | Да | Много | Связь с другой таблицей |
| Unique Key | Да | Да (обычно) | Много | Альтернативный уникальный идентификатор |
| Candidate Key | Да | Нет | Много | Потенциальный primary key |
Практические рекомендации
-- ХОРОШО: Использование искусственного PK
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(100) UNIQUE NOT NULL,
username VARCHAR(50) UNIQUE NOT NULL
);
-- Индексы на часто используемые поля для поиска
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_username ON users(username);
-- ХОРОШО: Использование составного ключа для связей many-to-many
CREATE TABLE user_roles (
user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
role_id INT NOT NULL REFERENCES roles(id) ON DELETE CASCADE,
PRIMARY KEY (user_id, role_id)
);
Вывод
Выбор правильного типа ключа критичен для:
- Целостности данных — ключи предотвращают дублирование и ошибки
- Производительности — индексы на ключах ускоряют поиск и объединения
- Масштабируемости — правильная схема БД упрощает расширение системы
- Поддерживаемости — ясная структура ключей облегчает понимание схемы