Перейти к основному содержимому

Знакомство с базами данных

Разработчику Аналитику Тестировщику
Архитектору Инженеру


Знакомство с базами данных

Мы уже разобрались с данными, информацией, сайтами и программами. Слова БД и СУБД встречались по ходу — здесь разложим их по полочкам без перегруза формулами.

База данных (БД) — сами данные и правила, по которым они организованы. СУБД (система управления базами данных) — программа, которая хранит эти данные на диске, принимает запросы, следит за целостностью и даёт доступ нескольким приложениям одновременно. В разговоре "база MySQL" обычно означает и данные, и СУБД — в учебниках различие полезно помнить.

Дальше — от простого к моделям хранения и выбору SQL / NoSQL / NewSQL.


Что такое база данных?

База данных — упорядоченное хранилище информации по заданной схеме — какие сущности есть, какие у них поля, какие связи и ограничения допустимы.

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

  1. Хранение и обработка в вычислительной системе — архивы, библиотечные каталоги или электронные таблицы без СУБД обычно БД не называют, хотя в них тоже есть упорядоченные данные.
  2. Логическая структурированность — явно выделены элементы, связи между ними, типы и допустимые операции (поиск, изменение, отчёт).
  3. Схема (метаданные) — формальное описание содержания, структуры и ограничений целостности. По ГОСТ Р ИСО МЭК ТО 10032-2007 (эталонная модель управления данными) постоянные данные в среде БД состоят из схемы и собственно базы данных; СУБД использует определения в схеме для доступа и контроля прав.

Типичные определения из литературы:

  • совокупность данных, организованных по правилам и поддерживаемых в памяти компьютера для отражения предметной области;
  • совместно используемый набор логически связанных данных и описания этих данных (схемы), удовлетворяющий информационным потребностям организации.

Удобная аналогия — записная книжка коллег — имя, телефон, отдел. В IT то же самое на другом масштабе — пользователи, товары, заказы, посты, логи.

БД и СУБД в разговоре

Часто говорят "база MySQL", имея в виду и данные, и программу-менеджер. В учебниках база данных — содержимое и правила организации; СУБД — программный комплекс, который это содержимое создаёт, хранит и обслуживает. Подробнее — в главе СУБД.

Базы данных помогают:

  • быстро искать и менять записи;
  • не терять данные при сбоях (если СУБД настроена правильно);
  • дать нескольким программам доступ к одним и тем же данным без "каши каждый в своём файле".

Типичный сценарий: сайт отправляет запрос "список пользователей с пагинацией", СУБД находит строки и отдаёт результат за миллисекунды — даже при миллионах записей, если есть индексы и разумная схема.


Схема базы данных

Схема базы данных (англ. database schema) — формальное описание содержания, структуры и ограничений целостности, по которым создают и сопровождают БД. В реляционных СУБД схема задаёт таблицы (отношения), столбцы с типами и обязательностью, первичные и внешние ключи, проверочные ограничения. Текст схемы хранится в словаре данных (каталоге системы); на диаграммах схему часто рисуют как таблицы и линии связей по внешним ключам.

Три уровня схемы (классическая схема проектирования):

УровеньЧто описываетПример артефакта
КонцептуальнаяПонятия предметной области и связи между нимиER-диаграмма без типов SQL
ЛогическаяСущности, атрибуты, ключи, кардинальностьЛогическая модель перед CREATE TABLE
ФизическаяКак логика ложится на файлы, индексы, разбиенияDDL, партиции, индексы в PostgreSQL

На концептуальном уровне говорят о сущностях (наборах однотипных фактов), атрибутах (свойствах) и связях между сущностями. Логическая схема переводит это в отношения и ключи; физическая — в конкретные объекты СУБД на диске.

Слово "schema" в продуктах

В Oracle и SQL Server schema — ещё и пространство имён объектов (набор таблиц, представлений, процедур у пользователя или в БД). В PostgreSQL CREATE SCHEMA создаёт такое пространство (public, app, …). Это имя контейнера внутри одной БД, отдельно от "схемы данных" как описания структуры предметной области. См. мини-глоссарий.

Play ITЗагрузка интерактивного демо…


Модели данных и связи

Модель данных в классической теории БД — формальная теория представления и обработки данных в СУБД. Она включает три аспекта (по Э. Ф. Кодду и К. Дж. Дейту):

АспектСодержание
СтруктураКакие типы объектов и логические структуры допустимы (отношения, сегменты, документы…)
МанипуляцияКак переходить между состояниями БД и извлекать данные (алгебра, навигация по указателям, API)
ЦелостностьКакие ограничения должны выполняться всегда (ключи, домены, ссылочная целостность)

Каждая СУБД построена на явной или неявной модели — реляционные — на реляционной модели данных (РМД), MongoDB — на документной, Redis — на "ключ–значение" и т.д.

Модель данных и схема БД

Модель данных — инструмент и теория (как язык программирования). Схема конкретной БД — результат проектирования на этом инструменте (как программа на языке). Путать "модель данных" со "схемой таблиц" — распространённая ошибка; подчёркивали Дейт, Когаловский, Кузнецов.

На практике до DDL это "карта" сущностей, полей и связей. Теория реляционной модели — в Теоретических основах и в разделе SQL.


Два разных слова "relation"

ТерминОткудаЧто значит
relationреляционная модель КоддаОтношение — таблица как набор кортежей (строк). Отсюда слово реляционная БД.
relationshipER-моделированиеСвязь между сущностями на диаграмме ("покупатель размещает заказ").

Реляционная СУБД хранит данные в отношениях (таблицах) и связывает их через ключи и JOIN. Связи в ER — проектный язык; в SQL они становятся внешними ключами (FOREIGN KEY) и запросами.

Подробнее: Entity Relationship, Теоретические основы, Реляционная модель.

image.png

На схеме выше — сущности "Пользователь" и "Группа". У пользователя есть поле с ID группы: так реализуется связь один ко многим.

Такие рисунки называют ER-диаграммами (Entity-Relationship; ERD в карте нотаций). Их рисуют на этапе проектирования; в работающей БД те же сущности — таблицы и ограничения.


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

Реляционные СУБД хранят данные в таблицах (отношениях). Схема задаёт столбцы, типы и ограничения; запросы чаще всего пишут на SQL.

Внешне таблица похожа на лист Excel — у СУБД при этом есть транзакции, одновременный доступ многих клиентов, внешние ключи, индексы, права доступа.

Пример таблицы users:

IDИмяE-mailВозраст
1Аннаanna@mail.com25
2Иванivan@mail.com30

У каждого столбца — свой тип (INTEGER, VARCHAR, DATE и т.д.) и правила (NOT NULL, уникальность).

Примеры реляционных СУБД — PostgreSQL, MySQL, Microsoft SQL Server, SQLite.

Сила модели — в связях между таблицами: заказ ссылается на клиента, строка заказа — на товар. Ниже — упрощённая ER-схема магазина:


Нереляционные и специализированные хранилища

NoSQLNot Only SQL — семейство СУБД под другие компромиссы — гибкая схема, горизонтальное масштабирование, низкая задержка, граф, кэш.

Документ в MongoDB может выглядеть так:

{
"id": 1,
"name": "Анна",
"email": "anna@mail.com",
"hobbies": ["рисование", "путешествия"]
}

У соседней записи может не быть поля hobbies — для документной модели это нормально.

Примеры NoSQL-СУБД — MongoDB, Redis, Cassandra, Neo4j.

В примерах названы СУБД (продукты), как MySQL или PostgreSQL.


Как выбирать

ЗадачаЧастый выборПочему
Учёт, платежи, строгие инвариантыРеляционная СУБД + SQLACID, FK, нормализация
Кэш, сессии, счётчикиRedis и т.п.Скорость, TTL
Каталог с разной структурой полейMongoDB и др.Гибкая схема
SQL + масштаб кластераNewSQLNewSQL

На реальных проектах часто несколько хранилищ: PostgreSQL для заказов, Redis для сессий — разделение нагрузок.

Углубление: SQL, NoSQL.

Дальше по маршруту раздела: роль БД в организациитеория и WALправила КоддаER-модель.


Четыре основных типа баз данных

В учебниках и на схемах архитектуры часто выделяют четыре семейства хранилищ — по тому, как устроены записи и связи между ними. Реляционные СУБД держат строгую схему таблиц и сильны в транзакциях; NoSQL даёт гибкую схему и горизонтальное масштабирование под высоконагруженные веб-сервисы; иерархические удобны для деревьев "родитель → потомок"; объектно-ориентированные хранят данные как объекты в духе ООП. На реальном проекте часто сочетают несколько типов — заказы в PostgreSQL, сессии в Redis.

ТипСутьТипичные задачиПримеры
Реляционные (SQL)Таблицы, строки, столбцы; связи через ключи и JOINФинансы, e-commerce, CRM, ERP, банки, складской учётPostgreSQL, MySQL, Oracle, SQL Server
NoSQLГибкая или отсутствующая схема; упор на масштаб и скорость простых операцийВеб в реальном времени, big data, CMS, IoTMongoDB, Cassandra, Redis, DynamoDB
ИерархическиеДерево: у потомка один родитель, поток данных вниз по веткеФайловые системы, XML, оргструктурыIBM IMS, реестр Windows, LDAP
Объектно-ориентированныеОбъекты с полями, наследованием и связями "как в коде"CAD, мультимедиа, сложное моделированиеObjectDB, db4o, Versant, GemStone

Подробнее про реляционную и NoSQL-модели — в разделах выше и ниже; углубление — SQL, NoSQL.


Реляционные (SQL) — особенности и выбор

Реляционные СУБД хранят структурированные данные в таблицах (отношениях), связанных ключами. Запросы пишут на SQL; транзакции обычно подчиняются ACID.

Сильные стороны:

  • декларативный SQL и зрелая экосистема инструментов;
  • ACID — надёжные транзакции при переводах, заказах, остатках;
  • сложные выборки с JOIN по многим таблицам;
  • сильная согласованность данных при одновременной работе клиентов;
  • стандартизированный язык запросов.

Когда выбирают: учёт денег и товаров, CRM, ERP, банковские системы, любая предметная область с жёсткими инвариантами и отчётами "как в Excel, но на миллионах строк".

Примеры продуктов — PostgreSQL, MySQL, Oracle, Microsoft SQL Server, SQLite (встраиваемая).


NoSQL — особенности и выбор

NoSQL (Not Only SQL) — семейство СУБД под другие компромиссы — горизонтальное масштабирование (шардирование), гибкая схема, высокая скорость простых чтений и записей. Внутри NoSQL выделяют документные, ключ–значение, колоночные и графовые модели — см. Основы NoSQL.

Сильные стороны:

  • масштабирование добавлением узлов, а не только более мощным сервером;
  • схема может меняться по записям (особенно в документных БД);
  • высокая производительность простых запросов по ключу или документу;
  • заточенность под современные веб-приложения и потоки событий.

Когда выбирают: ленты и чаты, каталоги с разной структурой полей, кэш и сессии, аналитика больших логов, датчики IoT.

Примеры — MongoDB, Cassandra, Redis, DynamoDB, Neo4j (граф).

SQL и NoSQL в одном проекте

PostgreSQL для заказов и Redis для сессий — обычная схема. Спор "что лучше" заменяют вопросом "какая нагрузка и какие гарантии нужны для этой части данных".


Иерархические

Иерархическая модель — данные как дерево: у каждого узла-потомка ровно один предок; у родителя может быть много детей. Движение по связям в основном вниз по заранее заданным путям.

Сильные стороны:

  • быстрый доступ, если путь известен ("все файлы в каталоге", "все подразделения отдела");
  • простые связи один ко многим;
  • эффективность при чтении по дереву;
  • понятная структура без лишних связей "вбок".

Когда выбирают: файловые системы, XML-хранилища, каталоги LDAP, организационные деревья, наследники мейнфреймовых систем.

Примеры: IBM IMS (классическая СУБД), реестр Windows, LDAP-каталоги. Близкая аналогия без отдельной СУБД — каталоги и подкаталоги на диске.

Запрос вверх по дереву или произвольные связи между ветками реализуют сложнее, чем в реляционной модели с JOIN — одна из причин, почему в корпоративном учёте победили таблицы SQL.


Объектно-ориентированные

Объектно-ориентированная СУБД (ООСУБД) хранит объекты — структуры с полями и методами, близкие к классам в Java, C# или Python. Поддерживаются наследование и полиморфизм на уровне хранилища.

Сильные стороны:

  • сложные связи между сущностями без "размазывания" по десяткам таблиц;
  • прямое сохранение объектов приложения;
  • богатое моделирование (вложенные структуры, наследники одного базового типа);
  • меньше слоя ORM между кодом и БД.

Когда выбирают: CAD/САПР, мультимедийные проекты, научное и инженерное моделирование с глубокой объектной моделью.

Примеры: ObjectDB, db4o, Versant, GemStone. В массовой веб-разработке чаще берут реляционную БД + ORM или документную MongoDB; ООСУБД остаются в узких нишах.


Другие модели и подтипы

Помимо четырёх "учебных" типов в истории и в специализации встречаются ещё варианты.

ТипСутьПримеры
Документная (подтип NoSQL)Записи в JSON/BSON, гибкая структура полейMongoDB
Ключ–значение (подтип NoSQL)Пары ключ → значение, часто в памятиRedis
Графовая (подтип NoSQL)Вершины и рёбра, обход связейNeo4j
Сетевая (историческая)Граф записей; у потомка несколько предковIDMS, IDS

Сетевая модель

Расширение иерархии: у потомка может быть несколько предков. Записи связаны типами связей; навигация — переход по указателям от предка к потомку и обратно. Модель была эффективна на железе 1960–70-х, но жёстко привязана к физической организации — смена структуры часто требовала переписывания приложений. Стандарт CODASYL; спор Кодда и Бахмана (1974) показал преимущество декларативной реляционной модели.

Реляционная модель — почему стала основой корпоративного учёта

Э. Ф. Кодд (1969–1970) предложил хранить всё в отношениях и оперировать ими через реляционную алгебру. Информационный принцип: содержимое БД задаётся только значениями в кортежах, без скрытых указателей между ячейками. Отсюда декларативный SQL и ограничения целостности в DDL. Иерархия, сеть и ООСУБД остались в нишах; реляционные БД — опора банков, ERP и большинства бизнес-приложений.

История носителей — от перфокарт до облачных СХД — в разделе "Данные и информация" и в внутреннем устройстве.