МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
____________________________
Кафедра ____________________________
РЕФЕРАТ
на тему: «Сравнение SQL и NoSQL на примере документоориентированных СУБД»
Выполнил(а): ____________________________
Группа: ____________________________
Проверил(а): ____________________________
2026
Содержание
- 3
- 6
- 8
- 11
1. Эволюция моделей данных
Первые системы управления базами данных появились задолго до реляционной модели. В 1960-х годах доминировали иерархические и сетевые структуры, воплощённые в таких продуктах, как IMS от IBM и CODASYL. В иерархической модели данные напоминали дерево: каждая запись имела одного родителя, что хорошо подходило для строго регламентированных производственных каталогов, но делало практически невозможным описание связей «многие ко многим». Сетевая модель пыталась решить эту проблему, позволяя записи иметь несколько родителей через указатели. Однако разработчик был вынужден вручную управлять этими связями, и это превращало проектирование базы в трудоёмкий инженерный процесс.
Перелом наступил в 1970 году, когда Эдгар Кодд, математик из IBM, опубликовал статью «A Relational Model of Data for Large Shared Data Banks». Он предложил отказаться от физических указателей и представить данные как множество таблиц, связанных через значения атрибутов. Это был радикальный шаг. Пользователь оперировал не навигацией по структуре, а декларативными запросами, которые описывали желаемый результат, а не способ его получения. Реляционная модель дала мощный математический фундамент, основанный на теории множеств, и позволила абстрагироваться от деталей хранения. К концу 1980-х годов SQL стал стандартом де-факто, а реляционные СУБД вытеснили своих предшественников в большинстве корпоративных приложений.
Однако к началу 2000-х годов реляционные системы столкнулись с вызовом, к которому не были готовы. Рост интернет-аудитории породил приложения с миллионами одновременных пользователей, генерирующих огромные объёмы слабоструктурированных данных: логи, сообщения, профили, телеметрию. Реляционная модель требовала жёсткой схемы: каждая таблица имела заранее определённые колонки с фиксированными типами, а любые изменения схемы сопровождались дорогостоящими операциями
ALTER TABLE. Хранение разнородных объектов вроде комментариев или товарных описаний заставляло разработчиков дробить их на множество нормализованных таблиц и затем собирать обратно через сложные JOIN-запросы. Это работало, но лишь до определённого предела.
Главным же препятствием стало масштабирование. Реляционные СУБД проектировались как монолитные серверы, которые наращивают мощность за счёт увеличения ресурсов одной машины, то есть вертикально. Такое решение упирается в физические ограничения оборудования. Лицензирование и стоимость мощных серверов растут непропорционально быстро. Интернет-гиганты вроде Google и Amazon нуждались в другом подходе: дешёвые кластеры из сотен обычных машин, где данные распределяются между узлами, и система продолжает работать при отказе одного из них. Это называется горизонтальным масштабированием, и классические реляционные СУБД его практически не поддерживали. Попытки шардирования требовали ручной настройки и приводили к потере многих удобств SQL, включая транзакции и соединения таблиц.
Ответом стало движение NoSQL. Термин впервые прозвучал в 1998 году, но широкое распространение получил после конференции 2009 года в Сан-Франциско. Изначально аббревиатура означала «Not Only SQL», подчёркивая, что это не отказ от реляционных баз, а дополнение к ним для специфических задач. Джоэл Сполски и другие разработчики из таких компаний, как Google и Facebook, публиковали описания своих внутренних систем: BigTable, Cassandra, Dynamo. Общим в этих проектах было то, что они жертвовали строгой согласованностью и богатством запросов ради доступности и масштабируемости. Данные хранились в более простых структурах, которые легче распределять по кластерам.
Сегодня NoSQL-системы принято делить на четыре основные категории. Хранилища типа «ключ-значение», например Redis, предлагают самый простой интерфейс: получить или записать значение по
уникальному ключу. Колоночные базы, вроде Cassandra, хранят данные в виде разреженных таблиц, где каждая строка может иметь произвольный набор колонок; это удобно для аналитики и временных рядов. Графовые СУБД, такие как Neo4j, моделируют связи между сущностями как первоклассных граждан, что критично для социальных сетей или рекомендательных систем. Наконец, документоориентированные базы, включая MongoDB, хранят цельные объекты в формате JSON или BSON. В отличие от реляционных таблиц, документ не требует унификации: один объект может содержать вложенные массивы и отличаться по структуре от соседнего. Именно этот класс систем, благодаря гибкости схемы и естественному соответствию объектной модели программирования, стал главным конкурентом SQL в веб-разработке и послужит основным предметом сравнения в последующих главах.
2. Архитектурные различия SQL и NoSQL
Реляционная модель, которую Эдгар Кодд предложил в 1970 году, строится на жёсткой предопределённой схеме. Перед занесением данных разработчик обязан спроектировать таблицы, указать типы столбцов и ограничения. Этот каркас фиксируется раз и навсегда. Последующее изменение структуры (например, добавление нового атрибута) требует выполнения ALTER TABLE и миграции. Ключевой принцип здесь, нормализация: данные разбиваются на мелкие логические сущности, чтобы исключить дублирование. Связи между этими сущностями моделируются через внешние ключи, которые ссылаются на первичные ключи других таблиц. Такой подход гарантирует ссылочную целостность на уровне ядра СУБД, но расплатой становится сложность запросов. Чтобы собрать данные из разных таблиц в единый результат, требуются множественные JOIN.
Документоориентированные СУБД исповедуют противоположную философию. Вместо плоских таблиц они оперируют документами, сериализованными в JSON-подобные форматы. Документ самодостаточен: он содержит все атрибуты конкретной сущности, включая вложенные массивы и объекты. Схема здесь не фиксирована. Один документ может иметь поле `phone`, а другой в той же коллекции, его отсутствовать или иметь массив из трёх номеров. Это позволяет эволюционировать модели данных без простоев и миграций, что критично для проектов с нестабильными требованиями. При этом нормализация не применяется. Вместо неё используется денормализация: данные часто намеренно дублируются в разных документах ради скорости чтения. Отказ от внешних ключей логичен: связи в NoSQL обычно выражаются через вложенные структуры или хранятся как идентификаторы без проверки их существования на уровне базы.
Различия в хранении данных напрямую вытекают из этих архитектурных решений. Реляционные системы традиционно используют B-деревья для индексации. Индекс в SQL строится на столбце таблицы и представляет собой
сбалансированное дерево, где каждый узел содержит отсортированные ключи и указатели на строки. Это оптимизировано для точечных запросов и диапазонных выборок. Документоориентированные СУБД также применяют B-деревья, но индексируют поля внутри документов, а не столбцы. Поскольку документ является единым хранилищем данных, индекс можно создать на любой вложенный ключ, например `author.name` или `items.price`. Механика поиска отличается. В SQL сначала идёт обращение к индексу, затем подтягиваются нужные столбцы из таблицы. В NoSQL индекс сразу содержит ссылку на весь документ целиком. Это устраняет необходимость в дополнительных операциях чтения, но увеличивает размер индекса.
Пожалуй, самое существенное различие касается масштабируемости. Реляционные базы исторически рассчитаны на вертикальное масштабирование: увеличение мощности одного сервера через добавление процессоров, оперативной памяти или SSD-дисков. Этот путь прост в реализации, но упирается в физические пределы оборудования и высокую стоимость. Более того, распределение реляционной базы на несколько узлов требует шардирования, которое ломает механизм внешних ключей и транзакций. Документоориентированные системы изначально проектировались для горизонтального масштабирования. Данные распределяются по кластеру серверов автоматически, через шардирование по ключу или диапазону. Каждый узел хранит свою часть данных и обрабатывает запросы независимо. Денормализованные документы отлично подходят для этой модели: они не зависят от данных на других узлах, поэтому чтение и запись не требуют межсерверных коммуникаций. Добавление нового узла в кластер масштабирует систему почти линейно. Для классических SQL-решений такой результат недостижим.
3. Языки запросов и целостность данных
Язык запросов сегодня одно из главных полей противостояния реляционного и документоориентированного подходов. Архитектура определяет, где и как лежат данные. А язык запросов решает, насколько мучительно их оттуда доставать. Разница здесь принципиальная, она меняет сам способ мышления разработчика.
SQL устроен как декларативный язык. Вы описываете, что хотите получить, а не как это сделать. Оптимизатор сам решает, в каком порядке сканировать таблицы, какие индексы применять и как соединять данные. Для работы с нормализованной схемой это дает огромную гибкость. Один запрос может соединить пять таблиц, сгруппировать результаты и применить агрегатные функции вроде SUM, AVG или COUNT. Возможность выразить сложную аналитическую выборку одним предложением делает SQL незаменимым в отчетности и финансовых системах, где данные всегда структурированы и связаны.
Документоориентированные СУБД пошли другим путем. Вместо универсального декларативного языка они предлагают API и специализированные языки запросов, работающие с JSON-подобной структурой документа. Вместо JOIN вы обращаетесь к вложенным полям и массивам напрямую. Такой подход быстрее осваивается и проще в повседневных операциях: найти документ по полю, изменить его целиком, выбрать по условию. Но плата за это, отсутствие мощных операций соединения. В большинстве документоориентированных СУБД JOIN либо отсутствует вовсе, либо поддерживается урезанно и требует явного указания структуры связи. Если данным нужны сложные перекрестные выборки, придется делать несколько запросов или денормализовывать данные, что противоречит реляционной логике.
Целостность данных, второй фундаментальный разлом. Реляционные СУБД исповедуют ACID: атомарность, согласованность, изоляцию и долговечность.
Транзакция либо выполняется полностью, либо не выполняется вовсе. Это гарантирует, что при сбое системы не останется половины выполненной операции. В финансовых операциях, бронировании билетов или управлении складскими остатками потеря атомарности недопустима. Согласованность ACID означает, что каждая транзакция переводит базу из одного корректного состояния в другое, и все ограничения проверяются автоматически.
NoSQL-системы используют BASE: Basically Available, Soft state, Eventual consistency. База всегда доступна, но состояние может быть временно несогласованным. Вместо мгновенной консистентности предлагается конечная: если запись обновлена, то через некоторое время все реплики получат это обновление. Это радикально иной компромисс. Для социальной сети или каталога товаров секундная задержка синхронизации между серверами незаметна, зато система продолжает работать при отказе отдельных узлов. Но если вы строите банковскую систему, где ошибка в транзакции стоит денег, BASE-подход становится ловушкой.
Ограничения целостности в SQL реализованы на уровне схемы. Внешние ключи гарантируют, что ссылка на несуществующую запись невозможна: база просто не даст создать «висячую» связь. CHECK-ограничения контролируют допустимые значения: например, возраст не может быть отрицательным, а сумма заказа, нулевой. Эти проверки выполняются на стороне СУБД, независимо от приложения. Разработчик может ошибиться в коде, но база данных, последний рубеж защиты от некорректных данных.
В документоориентированных СУБД таких ограничений нет. Схема гибкая, а значит, база не знает заранее, какие поля обязательны, а какие типы допустимы. Внешние ключи отсутствуют в принципе: связь между документами существует только в логике приложения. Проверка целостности перекладывается на разработчика. Это осознанный выбор: гибкость и скорость разработки ценятся выше формальной гарантии корректности. Но цена этой свободы, риск появления
«мусорных» данных, которые сложно обнаружить и исправить на поздних стадиях проекта.
Итог очевиден: выбор между SQL и документоориентированными СУБД, это выбор между формальной строгостью и операционной гибкостью. SQL предлагает мощный язык запросов и жесткие гарантии целостности. NoSQL, простоту работы с документом и масштабируемость, но требует дисциплины от программиста. Для задач, где данные должны быть точными и взаимосвязанными, реляционный подход остается эталоном. Для быстро меняющихся интернет-приложений с неструктурированными данными документоориентированные СУБД часто оказываются практичнее, несмотря на урезанные возможности запросов и ослабленный контроль целостности.
4. Применимость и критерии выбора
Предыдущие главы показали, насколько сильно различаются реляционные и документоориентированные системы на уровне архитектуры и языков запросов. Теперь эти различия стоит перевести в практическую плоскость и понять, какая модель оправдана в конкретной задаче. Универсального ответа не существует, а попытки его найти обычно выливаются в догматические споры, которые к реальной разработке имеют мало отношения.
Традиционные SQL-системы сохраняют позиции там, где цена ошибки в данных особенно высока. Банковский перевод или проводка в ERP-системе не терпят компромиссов с согласованностью. Если транзакция не завершится полностью, последствия будут катастрофическими. Реляционная модель с её ACID-гарантиями и жёсткими ограничениями целостности остаётся стандартом для финансового учёта, складских остатков и кадровых записей. Сложные аналитические запросы с множественными соединениями таблиц, которые в таких системах неизбежны, тоже естественнее выражать на SQL. Например, подсчёт налоговой базы по тысячам счетов с учётом всех справочников и иерархий подразделений, это задача, где у реляционной модели конкурентов просто нет.
Документоориентированные СУБД решают противоположный класс проблем. Когда структура данных меняется каждую неделю, а продукт нужно выпустить на рынок за месяц, предопределённая схема становится тормозом. MongoDB или Couchbase позволяют хранить JSON-документы без миграций и простоя. Каталог товаров интернет-магазина здесь выглядит очень показательно: у электроники одни атрибуты, у одежды другие, у цифровых товаров третьи. Описывать это в виде таблиц с сотнями nullable-колонок мучительно, тогда как в документе каждый товар хранит только свои поля. Горизонтальное масштабирование через шардирование, которое в SQL-системах требует серьёзной инженерной работы, в документоориентированных базах заложено в
архитектуру изначально. Нагрузка в тысячу запросов в секунду на блог или ленту новостей распределяется по кластеру простым добавлением узлов.
Выбор между двумя моделями сводится к четырём конкретным критериям. Первый, структура данных. Если она стабильна и известна заранее, SQL даёт больше контроля и эффективности. Если данные слабоструктурированы или их форма постоянно эволюционирует, документы выигрывают. Второй критерий, требования к масштабированию. Для вертикального роста с увеличением мощности одного сервера SQL достаточно; для горизонтального распределения нагрузки на десятки машин NoSQL удобнее. Третий, сложность запросов. Чем больше связей между сущностями и чем глубже аналитика, тем сильнее преимущество SQL. Простые запросы по ключу или фильтру выполняются в документоориентированных СУБД не хуже. Четвёртый критерий часто упускают из виду: команда разработчиков. Если программисты годами работали с PostgreSQL, переход на MongoDB потребует переучивания и неизбежных ошибок на старте. Обратная ситуация столь же болезненна.
Однако жёсткая дихотомия «или SQL, или NoSQL» устарела. Крупные системы всё чаще используют гибридную стратегию, когда разные типы данных живут в разных хранилищах. Интернет-магазин может держать каталог товаров в Elasticsearch или MongoDB, а заказы и платежи в PostgreSQL. Это не эклектика, а рациональное распределение нагрузки: каждому типу данных достаётся система, которая лучше всего с ним справляется. Подход описан в книге Мартина Клеппмана «Проектирование событийных систем» (2020), где он называет подобную практику «полиглотной персистентностью». Показательный пример из практики: компания Zalando, европейский ритейлер одежды, использует PostgreSQL для управления заказами и AWS DynamoDB для кэширования корзины покупок.
Граница между моделями постепенно размывается. Реляционные СУБД добавляют поддержку JSON-полей (PostgreSQL сделал это в версии
9.4), а документоориентированные системы вводят транзакции (в MongoDB это произошло начиная с версии 4.0). Тем не менее базовая специализация сохраняется. Вопрос выбора сводится к тому, что важнее в конкретном проекте: гарантированная целостность при сложных взаимосвязях или скорость разработки и лёгкость масштабирования. Ответ на этот вопрос определяет архитектуру на годы вперёд, поэтому ошибка здесь дорого обходится.
Нужна такая же работа по своей теме? Соберём структуру, текст и источники в этом же оформлении.