# Реляционная база данных

> База данных, в которой информация хранится в виде таблиц (отношений), связанных ключами, а запросы выражаются декларативно — обычно на языке SQL.

Источник: https://llmdocs.ru/wiki/relational-database/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Модель данных**: реляционная (таблицы, строки, столбцы)
- **Автор модели**: Эдгар Кодд (IBM, 1970)
- **Язык запросов**: SQL
- **Гарантии**: транзакции ACID
- **Примеры СУБД**: PostgreSQL, MySQL, SQLite, Oracle Database, Microsoft SQL Server
- **Противопоставляется**: NoSQL
**Реляционная база данных** — база данных, построенная на реляционной модели: данные хранятся в **таблицах** (в теории — *отношениях*), каждая строка описывает один объект, каждый столбец — один его атрибут, а связи между таблицами задаются через значения ключей. Программа, которая управляет такой базой, называется реляционной СУБД (РСУБД, англ. *RDBMS*). Почти все РСУБД используют язык [SQL](https://llmdocs.ru/wiki/sql.md): пользователь описывает, *какие* данные нужны, а СУБД сама решает, *как* их достать.

Реляционные базы — самый распространённый способ хранить данные приложений: от [SQLite](https://llmdocs.ru/wiki/sqlite.md) внутри смартфона до кластеров [PostgreSQL](https://llmdocs.ru/wiki/postgresql.md) и [MySQL](https://llmdocs.ru/wiki/mysql-mariadb.md), обслуживающих интернет-магазины и банки.

## История

Модель предложил сотрудник IBM Эдгар Кодд в статье «Реляционная модель данных для больших совместно используемых банков данных» (1970).[1] До этого господствовали иерархические и сетевые базы, где программист вручную «ходил» по указателям между записями, а любое изменение структуры ломало программы. Кодд предложил опираться на математическую теорию множеств и логику предикатов: данные описываются отношениями, а запросы — операциями над ними (выборка, проекция, соединение).

В IBM на основе этой идеи построили экспериментальную систему System R и язык SEQUEL, позже переименованный в SQL (1974).[4] Первой коммерческой реляционной СУБД стала Oracle (1979), затем появились IBM DB2, Ingres, Sybase и Microsoft SQL Server. В 1990-х возникли открытые PostgreSQL и MySQL, в 2000 году — встраиваемая SQLite.

## Основные понятия

| Термин теории | Термин SQL | Смысл |
|---|---|---|
| отношение | таблица | множество однотипных записей |
| кортеж | строка | одна запись |
| атрибут | столбец | поле записи определённого типа |
| домен | тип данных | допустимые значения атрибута |

- **Первичный ключ** (primary key) — столбец или набор столбцов, однозначно определяющий строку, например `id` пользователя.
- **Внешний ключ** (foreign key) — столбец, ссылающийся на первичный ключ другой таблицы. СУБД не даст создать заказ для несуществующего покупателя или удалить покупателя, у которого есть заказы (если не указано каскадное удаление).[3]
- **Ограничения целостности** — `NOT NULL`, `UNIQUE`, `CHECK`: правила, которые база проверяет при каждой записи, независимо от кода приложения.
- **Схема** — описание всех таблиц, столбцов, типов и ограничений. Её изменения обычно оформляют как [миграции](https://llmdocs.ru/wiki/schema-migrations.md).

## Пример

Покупатели и их заказы хранятся в двух таблицах, связанных внешним ключом:

```sql
CREATE TABLE customers (
    id    bigint PRIMARY KEY,
    name  text   NOT NULL,
    email text   UNIQUE
);

CREATE TABLE orders (
    id          bigint  PRIMARY KEY,
    customer_id bigint  NOT NULL REFERENCES customers(id),
    total       numeric(12, 2) CHECK (total >= 0),
    created_at  timestamptz DEFAULT now()
);

-- сумма заказов по каждому покупателю
SELECT c.name, sum(o.total) AS spent
FROM customers c
JOIN orders o ON o.customer_id = c.id
GROUP BY c.name
ORDER BY spent DESC;
```

Данные о покупателе записаны ровно в одном месте; заказы ссылаются на него по `id`. Такое разделение, устраняющее дублирование, называется [нормализацией](https://llmdocs.ru/wiki/normalization.md).

## Чем хороши реляционные базы

- **Декларативные запросы.** Один и тот же запрос работает и на тысяче строк, и на миллиарде — оптимизатор выбирает порядок соединений и [индексы](https://llmdocs.ru/wiki/database-index.md); увидеть его решение можно через [EXPLAIN](https://llmdocs.ru/wiki/explain.md).
- **Транзакции.** Группа изменений выполняется целиком или не выполняется вовсе, с гарантиями [ACID](https://llmdocs.ru/wiki/transaction-acid.md).
- **Целостность.** Типы и ограничения не позволяют записать в базу заведомо некорректные данные.
- **Гибкость запросов.** Данные можно соединять и агрегировать так, как не планировалось при проектировании схемы.
- **Зрелость.** Десятилетия эксплуатации, стандарт SQL, огромная экосистема драйверов, [ORM](https://llmdocs.ru/wiki/orm.md), инструментов резервного копирования и [репликации](https://llmdocs.ru/wiki/replication.md).

## Ограничения и альтернативы

Строгая схема требует продумывать структуру заранее, а горизонтальное масштабирование записи на много серверов ([шардирование](https://llmdocs.ru/wiki/sharding.md)) у классических РСУБД сложнее, чем у распределённых хранилищ. В 2000-х это породило движение [NoSQL](https://llmdocs.ru/wiki/nosql.md): документные ([MongoDB](https://llmdocs.ru/wiki/mongodb.md)), ключ-значение ([Redis](https://llmdocs.ru/wiki/redis.md)), колоночные и графовые базы. Для аналитики над огромными объёмами используются СУБД с [колоночным хранением](https://llmdocs.ru/wiki/columnar-storage.md), например [ClickHouse](https://llmdocs.ru/wiki/clickhouse.md).

Со временем границы размылись: PostgreSQL хранит JSON-документы и векторы ([pgvector](https://llmdocs.ru/wiki/pgvector.md)), а многие NoSQL-системы добавили транзакции и SQL-подобные языки. Для большинства приложений реляционная база остаётся разумным выбором по умолчанию; SQLite подходит, когда базе не нужен отдельный сервер.[5]

## См. также

- [SQL](https://llmdocs.ru/wiki/sql.md)
- [PostgreSQL](https://llmdocs.ru/wiki/postgresql.md)
- [Транзакция и ACID](https://llmdocs.ru/wiki/transaction-acid.md)
- [Индекс (базы данных)](https://llmdocs.ru/wiki/database-index.md)
- [Нормализация](https://llmdocs.ru/wiki/normalization.md)

## Источники

1. [E. F. Codd — A Relational Model of Data for Large Shared Data Banks (CACM, 1970)](https://dl.acm.org/doi/10.1145/362384.362685)
2. [PostgreSQL Documentation — Concepts](https://www.postgresql.org/docs/current/tutorial-concepts.html)
3. [PostgreSQL Documentation — Constraints](https://www.postgresql.org/docs/current/ddl-constraints.html)
4. [D. D. Chamberlin, R. F. Boyce — SEQUEL: A Structured English Query Language (1974)](https://dl.acm.org/doi/10.1145/800296.811515)
5. [SQLite — Appropriate Uses For SQLite](https://www.sqlite.org/whentouse.html)
