Раздел 10 · Databases

Ключи: потенциальные, первичные и внешние

junior~15 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

В прошлом уроке мы договорились: в отношении не бывает двух одинаковых кортежей. Но как СУБД узнаёт, что кортежи одинаковые? И как одна таблица ссылается на строку в другой, если стрелок, как в сетевой модели, больше нет? Ответ на оба вопроса один: ключи. Этот урок разбирает, какие они бывают и как их выбирать.

Как отличить одного человека от другого

Подумай, по чему можно однозначно найти человека в стране. По имени нельзя: Иванов Иванов много. По имени и дате рождения уже лучше, но тёзки-ровесники встречаются. По номеру паспорта можно: он у каждого свой. По ИНН тоже можно. А номер телефона? Вроде у каждого свой, но телефон бывает общим на семью, а бывает, что его нет вообще.

Получается, у человека несколько признаков, каждого из которых достаточно для опознания: паспорт, ИНН, СНИЛС. А есть признаки, которых недостаточно: имя, город. Ключи в базе данных устроены точно так же.

Суперключ и потенциальный ключ

Возьмём таблицу сотрудников:

employees
passport    | inn          | email           | name | department
------------+--------------+-----------------+------+-----------
4510 123456 | 772812345678 | petya@corp.ru   | Петя | Склад
4511 654321 | 773498765432 | anya@corp.ru    | Аня  | Склад

Суперключ это любой набор колонок, по которому строки никогда не совпадают. Паспорт суперключ. Пара «паспорт и имя» тоже суперключ: раз паспорт уже уникален, добавка имени уникальность не испортит. Даже все колонки вместе это суперключ, ведь одинаковых строк в отношении нет.

Суперключ может содержать лишнее. Интереснее минимальные наборы, из которых ничего нельзя выкинуть. Их называют потенциальными ключами. Здесь их три: passport, inn и email. Пара «паспорт и имя» не потенциальный ключ: имя в ней лишнее.

Ключ бывает и составным, из нескольких колонок. Вспомни таблицу book_authors из урока про модели данных: ни book_id, ни author_id по отдельности не уникальны, а пара уникальна. Пара (book_id, author_id) это один составной потенциальный ключ.

Важная тонкость: ключ определяется смыслом данных, а не тем, что сейчас лежит в таблице. Если в таблице две строки и имена у них разные, это не делает имя ключом. Спроси себя: может ли в принципе появиться второй человек с таким же значением? Если может, это не ключ.

дальше после входа

Урок целиком открыт всем, кто вошёл. Войди по своему email, чтобы читать дальше.

Вход пока по приглашению. Если хочешь учиться, напиши Vassiliy.