awesome-everything EN
↑ Обратно к восхождению

Базы данных

Что такое отношение: таблицы, строки, ключи и ограничения

Суть Базовый словарь реляционной модели — отношения, кортежи, candidate keys и почему декларативные ограничения — главный вклад модели.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на junior-высоте — поверхность
◷ 12 min

Команда хранит «пользователь имеет много тегов» как CSV-колонку. Через шесть месяцев: «сколько пользователей с тегом X?» — нужно парсить каждую строку. Реляционный дизайн отвечает на этот вопрос точечным поиском. Разница — в модели, с которой начинают.

Что такое отношение

Статья Эдгара Кодда 1970 года заложила основы каждой SQL-базы данных с тех пор. Словарь невелик:

  • Отношение (relation) — набор кортежей общей формы. Таблица — SQL-реализация.
  • Кортеж (tuple) — одна строка; каждый кортеж в отношении имеет одинаковые атрибуты.
  • Атрибут (attribute) — колонка; каждый берёт значения из домена (типа).
  • Candidate key — минимальное подмножество атрибутов, уникально идентифицирующее каждый кортеж. У таблицы может быть несколько candidate keys; один назначается primary key.
КонцепцияSQL-терминЧто означает
RelationTableНабор строк общей формы
TupleRowОдна запись
AttributeColumnОдно именованное типизированное значение в строке
DomainTypeМножество допустимых значений атрибута
Candidate keyPRIMARY KEY / UNIQUEМинимальный идентификатор строки

Почему ограничения — главный вклад модели

Реляционная модель не просто хранит данные — она отказывается хранить плохие данные. Ограничения (constraints) — декларативные правила, которые движок проверяет перед каждой записью, обновлением или удалением:

  • PRIMARY KEY — уникально идентифицирует каждую строку; подразумевает NOT NULL и UNIQUE.
  • FOREIGN KEY — колонка, ссылающаяся на primary или unique key другой таблицы; движок отказывает в строках-сиротах.
  • NOT NULL — атрибут всегда должен иметь значение.
  • UNIQUE — в этой колонке или наборе колонок нет дублей.
  • CHECK — произвольное булево выражение, вычисляемое при каждой записи; например, CHECK (amount >= 0).

Без ограничений — это key-value хранилище с SQL-синтаксисом. Баги в приложении могут зафиксировать плохие данные. С ограничениями движок отказывает от имени каждого вызова — код приложения не должен помнить правила.

Метафора

Реляционная схема — библиотечный каталог. Каждая таблица — ящик (книги, авторы, выдачи). Каждая строка — карточка с одинаковыми полями. Карточка выдачи содержит member_id и book_id, ссылающиеся на другие ящики (foreign keys). Библиотекарь (движок) отказывается оформить выдачу, если book_id не существует. Система остаётся согласованной без постоянного контроля людей.

Практический сценарий

Дима · Origin-сервер хочет функцию «избранное» для маркетплейса. Олег · Origin БД задаёт вопрос о форме. Свен говорит «пользователь имеет много избранных». Отто обращается к модели: users, items, таблица favourites с (user_id, item_id) как PK плюс два FK. Три строки DDL — и функция структурно корректна: нет дублей, нет сирот, запросы в обе стороны. Ярлык с JSON-массивом ломается в момент, когда нужно: «кто добавил этот товар в избранное».

Другая команда хранит адреса как CSV-текст в строке пользователя. Через шесть месяцев маркетинг спрашивает «сколько пользователей в Орегоне?» — нужно парсить каждое поле. Реляционный дизайн (таблица addresses со структурированными колонками) — это две лишние строки схемы и на три порядка дешевле в запросах.

Почему это работает

Цена реляционной модели — проверка ограничений при записи и дисциплина проектирования схемы до написания кода. Опытные инженеры платят эту цену сознательно; новые команды либо платят случайно (сначала денормализуют, потом сожалеют), либо пропускают (используют БД как key-value хранилище и накапливают годы долга по integrity). Этот урок — о том, почему первый путь почти всегда дешевле на протяжении жизни системы.

Расставь шаги по порядку

Упорядочьте шаги проектирования схемы для 'пользователь имеет много адресов':

  1. 1 Определить сущности: User, Address
  2. 2 Для каждой сущности выбрать primary key (id BIGSERIAL или uuid)
  3. 3 Определить связь: один пользователь имеет много адресов (1:N)
  4. 4 Добавить колонку user_id в addresses с REFERENCES users(id)
  5. 5 Добавить NOT NULL на FK (каждый адрес принадлежит пользователю)
  6. 6 Добавить индекс на addresses(user_id) для быстрого поиска адресов пользователя
  7. 7 Выбрать ON DELETE: CASCADE или RESTRICT
Викторина

Что такое primary key в реляционной таблице?

Викторина

Что даёт объявление foreign key?

Закончи аналогию

Заполните пропуск: движок отказывает плохим вставкам из-за объявленных _______ — правил вроде NOT NULL, UNIQUE, FOREIGN KEY, CHECK.

Вспомните перед уходом
  1. 01
    В двух предложениях: почему хранить 'пользователь имеет много тегов' как JSON-массив в колонке обычно хуже, чем таблица тегов плюс join-таблица user_tags?
  2. 02
    Назовите пять видов ограничений реляционного движка и что делает каждый.
  3. 03
    В чём разница между candidate key и primary key?
Итог

Реляционная модель определяет данные как наборы типизированных кортежей общей формы (отношение). Таблицы, строки и колонки — SQL-реализации отношений, кортежей и атрибутов. Каждая строка идентифицируется candidate key — один становится primary key. Foreign keys связывают таблицы и позволяют движку отказывать в строках-сиротах. Пять видов ограничений (PK, FK, NOT NULL, UNIQUE, CHECK) — декларативные гарантии, которые перемещают корректность от каждого приложения к границе базы данных. Цена — дисциплина проектирования схемы до написания кода; выгода — корректность, которую каждый вызов получает бесплатно.

Связанные уроки
встречается в164
Продолжить восхождение ↑Ограничения, ключи и типы данных Postgres
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.