Ответ
Ключи в реляционных БД — это специальные атрибуты (столбцы или их наборы), которые используются для однозначной идентификации записей и установления связей между таблицами. Они обеспечивают целостность данных и ускоряют поиск за счёт индексов.
| Тип ключа | Назначение | Особенности | Пример 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. естественный) — важное решение при проектировании схемы БД. Ответ 18+ 🔞
А, ну вот, подъехали ключи в базах данных! Это ж, блядь, как замки в сейфе — без них всё развалится в пизду. Сейчас разжуем, что к чему, чтобы ты не был, как тот Герасим, только "му-му" говорить мог.
Смотри, ключи — это такие специальные столбцы или их связки, которые нужны, чтобы записи в таблицах не путались, как мартышки в зоопарке, и чтобы между таблицами порядок был. Без них — пиздец, анархия, данные превращаются в кашу, а ты потом ищешь, ищешь, и нихуя не находишь.
Вот тебе разбор полётов, как в лучших домах Парижа:
| Тип ключа | Зачем он нужен, этот ёперный театр? | Что в нём особенного, а? | Пример кода (чтоб глаза на лоб не полезли) |
|---|---|---|---|
| Первичный ключ (Primary Key, PK) | Чтобы каждую запись в таблице можно было ткнуть пальцем и сказать — вот она, сука, уникальная! | • Значения не повторяются и не могут быть пустыми (NULL). • Может быть из одного поля или из нескольких (составной). • Под него обычно индекс автоматом строится, чтобы искать быстро. |
```sql |
CREATE TABLE Users ( user_id INT PRIMARY KEY, -- Вот он, красавец, простой PK email VARCHAR(100) UNIQUE NOT NULL );
| **Внешний ключ (Foreign Key, FK)** | Чтобы создать **связь** между таблицами. Как верёвочка, которая тянется от одной к другой. | • Следит за порядком: нельзя воткнуть запись со значением, которого нет в связанной таблице. **Ссылочная целостность**, мать его!<br>• Может сам решать, что делать, когда запись в главной таблице удаляют или меняют (`ON DELETE CASCADE` — удалит всё связанное, `RESTRICT` — не даст удалить, пока есть связи). | ```sql
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
user_id INT, -- Сюда будем класть ID пользователя
FOREIGN KEY (user_id) REFERENCES Users(user_id)
ON DELETE CASCADE -- Удалили пользователя — все его заказы нахуй в корзину
);
``` |
| **Уникальный ключ (Unique Key)** | Гарантирует, что значения в столбце **не повторяются**. Но это не PK! | • Главное отличие от PK — обычно допускает **один NULL** (хотя это от СУБД зависит, блядь).<br>• Таких ключей в таблице можно навешать овердохуища. | ```sql
ALTER TABLE Users ADD CONSTRAINT unique_email UNIQUE (email); -- Чтобы почты не повторялись, ёпта
``` |
| **Составной ключ (Composite Key)** | Это когда первичный или уникальный ключ состоит из **двух или больше полей**. | • Уникальность тут — только в **комбинации**. По отдельности значения могут повторяться хоть сто раз. | ```sql
CREATE TABLE Enrollment (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id) -- Составной PK. Уникальна только пара "студент-курс"
);
``` |
**А теперь практическая магия, блядь:** Выбор первичного ключа — это как выбор жены, хули. Будешь брать естественный (типа номера паспорта или email) — может оказаться кривой и нестабильной. Возьмёшь суррогатный (типа `AUTO_INCREMENT` или `UUID`) — он скучный, но предсказуемый, как день сурка. Решай, исходя из задачи, а не потому что "в интернете так написали", а то потом будешь, как тот мудак Герасим, с совестью метаться.