Модели хранения: SQL, NoSQL и NewSQL
Оглавление · ADT и валидация · Архитектура
Задача: выбрать модель по запросам и инвариантам, а не по возрасту названия. Нужны множества, отображения, связи и различие данных и их представления.
Сначала вопросы к данным
Для учебной публикации нужны уникальный slug, автор, время публикации и гибкое содержимое. Читатель ищет опубликованную статью; редактор меняет её без потери чужих правок; аналитик считает просмотры за месяц. Это три разных нагрузки.
До выбора системы запишите: что является источником истины, какие изменения должны быть атомарны, какие запросы часты, какая задержка допустима и как восстанавливать данные. Объём без формы запросов мало говорит о подходящей модели.
Независимые оси
| Ось | Примеры | Какой вопрос задаём |
|---|---|---|
| Модель данных | Реляционная, документная, ключ–значение, графовая | Какие связи и операции естественны? |
| Язык обращения | SQL, API документов, команды ключей | Как выражаем запрос? |
| Физическая организация | Строки, колонки, индексы | Что читаем и записываем? |
| Распределение | Один узел, реплики, партиции | Где лежат копии и кто согласует запись? |
| Нагрузка | OLTP, OLAP, поиск | Меняем записи, агрегируем или ищем похожее? |
JSONB — тип PostgreSQL, а не конкурент SQL. Векторный индекс — способ поиска, который может жить рядом с реляционными таблицами. NoSQL объединяет разные семейства, а не задаёт одну гарантию транзакций или согласованности.
Реляционная модель
В математической модели отношение — множество кортежей фиксированной структуры. Связи описываются через ключи. SQL-таблица не буквально математическое множество: без ограничений возможны дубли, запросы имеют свою семантику NULL, а порядок без ORDER BY не задан. Нельзя переносить законы множеств на SQL механически.
Для учебных автора и статьи связь article.author_id → author.id позволяет
хранить имя автора один раз. Нормализация уменьшает неоднозначные копии фактов;
денормализация ради чтения добавляет ответственность за их согласованность.
Первичный ключ идентифицирует строку, UNIQUE ограничивает повторения, FOREIGN KEY — допустимые связи, NOT NULL и CHECK — значения строки. CHECK с результатом NULL не запрещает строку, поэтому ограничения отсутствия значения задаются явно. Ограничения PostgreSQL 17.
Runtime-схема проверяет вход одного процесса. Ограничение БД защищает хранение при нескольких писателях. Два клиента могут одновременно пройти предварительное «slug свободен»; корректность не должна зависеть от такой проверки.
Документы, ключи и графы
Документ удобно читать как агрегат: публикация вместе с блоками. Цена — повторяющиеся факты и граница обновления документа. Ссылки на другие документы всё равно требуют выбранной политики целостности. Документная модель MongoDB.
Ключ–значение удобно для обращения по известному ключу. Поиск всех публикаций по автору потребует дополнительной организации данных; возможность такой операции зависит от конкретного продукта и структуры, а не слова NoSQL.
Графовая модель подчёркивает вершины, рёбра и обходы связей. Wide-column организует данные вокруг ключей и семейств колонок; это не синоним аналитического столбцового хранения. Примеры: графовая модель Neo4j и моделирование Cassandra. Вводные модели разобраны в аналитике и векторном поиске.
Исходник схемы
flowchart TD Task["Запросы и инварианты"] --> Model["Модель и граница атомарности"] Model --> Access["Ключи, связи и индексы"] Access --> Load["Измерение чтения и записи"] Load --> Recovery["Отказы, восстановление и эксплуатация"] Recovery --> Choice["Обоснованный выбор системы"]
Это порядок исследования, а не автоматический алгоритм, который всегда выдаёт одну БД. Сначала достаточно одной системы; несколько источников добавляют синхронизацию, резервное копирование и диагностику каждого.
NewSQL и распределённый SQL
NewSQL — исторический термин для систем, пытающихся совместить SQL/транзакции и масштабирование операционных нагрузок. Это семейство архитектур, не новая версия языка. Обзор Pavlo и Aslett.
Шардирование разделяет данные, репликация создаёт копии. Оба требуют правил маршрутизации и согласования. Транзакция между узлами имеет стоимость сети; совместимость с SQL ещё не означает одинаковые задержки или поведение при отказе. Пример архитектуры — распределённая SQL-система CockroachDB.
Не обещайте HA от одного контейнера на одном VPS. В Atmanki PostgreSQL обслуживает Strapi; сайт читает CMS API. Распределённая БД для текущей учебной нагрузки не внедрена и не требуется для объяснения этих понятий.
Практика
Составьте четыре запроса: статья по slug, статьи автора, число просмотров за месяц, похожие публикации. Для каждого укажите допустимую устарелость, обязательные инварианты и способ восстановления. Найдите пример, где одна реляционная БД достаточна, и пример, где аналитическая копия может быть оправдана.
Объясните, почему PostgreSQL с JSONB одновременно поддерживает реляционные связи и документы. Для списка названий SQL/NoSQL/NewSQL/JSONB/OLAP отметьте, какие из них отвечают на разные вопросы и потому не образуют рейтинг «современности».