Какие базы данных существуют и для чего их используют: SQL, NoSQL, OLAP
Когда вы начинаете работу над новым проектом, важно понять, по каким критериям выбирать базы данных и какие вообще есть решения.
Иллюстрация: rawpixel.com / Graphue / Freepik / nadine shaabana / Unsplash / Дима Руденок для Skillbox Media
Существует много различных семейств баз данных, которые различаются структурой хранения, обработки и индексации данных. От основных пользовательских сценариев зависит, какая модель лучше подойдёт в том или ином случае. Иногда вполне оправданно использовать сразу несколько различных баз данных, копируя одни и те же данные несколько раз.
Вот наиболее важные критерии для выбора базы данных:
- какие данные в ней должны храниться,
- каким будет объём данных,
- какого рода запросы будут выполняться при обращении к базе данных.
Реляционные базы данных
(базы данных SQL)
Реляционные базы данных — самые распространённые. Вот лишь самые популярные из них: Oracle, Microsoft SQL Server, PostgreSQL, MySQL. Такие базы данных обеспечивают построчное хранение данных в таблицах, что подразумевает строгую структуру данных. А ещё подразумевается, что за одно обращение к базе вы будете запрашивать относительно небольшое количество записей.
Такие решения, как правило, довольно хорошо работают, если общий объём ваших данных не превышает нескольких терабайт (конечно, при наличии подходящей инфраструктуры), что в целом делает их подходящими для большинства проектов — особенно на начальном этапе разработки.
Реляционные базы данных стоит выбирать, если вам важны следующие характеристики:
- транзакционность;
- частые изменения данных;
- поиск по индексам;
- запросы небольшого количества записей за раз;
- объём данных не превышает нескольких терабайт.
Выбор конкретной реляционной базы данных зависит от дополнительных требований к безопасности, поддержке и других факторов. Например, в банковской сфере предпочитают использовать Oracle и Microsoft SQL Server. Однако это платные решения — а открытая и бесплатная PostgreSQL тоже показывает очень хорошую производительность, активно развивается и распространяется по свободной лицензии. Если у вас совсем небольшой проект, можно использовать любую реляционную БД.
Базы данных NoSQL
Альтернативой для реляционных баз данных являются NoSQL-базы. Это могут быть документоориентированные графовые базы данных или key-value-хранилища.
Документоориентированные базы данных
Документоориентированные базы (например, MongoDB, Amazon DocumentDB, CouchDB и другие) хранят данные сразу готовыми «документами», а не в таблицах и строках — как реляционные БД. Этот способ хранения подходит, когда структура данных может изменяться или ваши основные сценарии использования подразумевают загрузку составной структуры. Документоориентированные базы очень близки к формату ресурсов, которыми обмениваются клиент и сервер, что упрощает подготовку данных для передачи по сети.
В статьях и книгах в качестве типового примера работы таких БД часто приводят сценарий загрузки страницы пользователя в социальной сети. В этом случае у человека есть основные данные: ФИО, дата рождения, пол — и дополнительная информация, которая может включать в себя несколько элементов и требовать разной структуры. Например, места учёбы, проживания, работы.
Как известно, у одного человека может быть много мест учёбы или проживания, а адреса в разных странах могут состоять из разных сущностей. В России это область → город → улица → дом, а во Франции — провинция → регион → город → улица → дом. Да, такие структуры можно собирать и на реляционных БД, однако в этом случае придётся выполнить несколько дополнительных запросов, чтобы собрать всю информацию о человеке и отрисовать его страницу.
Документоориентированные базы данных позволяют хранить подобную информацию о пользователе целиком, в одном месте и получать её одним запросом.
При этом документоориентированные базы данных поддерживают возможность использования ссылок на другие записи в базе — а это позволяет приблизиться к реляционной модели. Кстати, реляционные модели тоже двигаются в сторону поддержки составных структур данных — таких как JSON — и позволяют выполнять поиск по содержимому «сложного, составного» поля.
Таким образом, главное преимущество документоориентированных баз данных — возможность хранения данных без строгого ограничения по структуре.
Key-value-хранилища
Key-value-хранилища (Redis, Aerospike, DynamoDB и другие) хранят данные в виде хеш-таблицы. В такой модели у каждой записи есть только один индекс. При этом нет строгого ограничения на структуру значения. Как правило, такие базы данных изменяют данные по принципу логов, то есть всегда дописывают значения в конец, а удаление выполняется при помощи добавления специальной записи. Key-value-хранилища хорошо служат в качестве кэша, очереди или логирования.
Графовые базы данных
Графовые базы данных хранят все данные в виде узлов и связей между ними. Этот подход может ускорять запросы в некоторых случаях и применяется в рекомендательных движках и приложениях, связанных с геопозиционированием. Так что, если вы делаете подобное приложение, возможно, вам стоит обратить внимание на графовые хранилища. Хотя надо признать — это специфические решения.
Базы данных OLAP
Для аналитических систем, которые предполагают работу с огромными объёмами данных — в десятки терабайт, а то и несколько петабайт, — существует отдельный класс хранилищ, которые хранят данные в колонкоориентированной модели.
В отличие от реляционной модели данных, где последовательно хранится вся строка таблицы, или документоориентированной модели, где последовательно хранится весь документ, здесь последовательно хранятся значения одной колонки, и подразумевается, что в одной и той же позиции каждой колонки хранятся значения, относящиеся к одной строке. Такая модель позволяет эффективно сжимать данные и строить над ними различные агрегаты: сумма, среднее, количество и другие.
OLAP-системы позволяют добавлять данные непрерывным потоком или загружать порциями — а вот удалять или изменять их обычно не разрешают. Их главная задача — позволить аналитикам и менеджменту компаний анализировать данные. Следовательно, они должны хранить историю событий, в то время как остальные БД подразумевают хранение лишь текущего состояния каждой сущности. Обычно OLAP-хранилища поддерживают синтаксис SQL-запросов, поскольку он хорошо подходит для аналитических задач.
Большинство решений в этой области — например, Vertica, Teradata, BigQuery — стоят довольно дорого. Однако есть и решения с открытым исходным кодом, такие как ClickHouse, Apache Druid и другие.
Что же выбрать?
Как правило, в большинстве проектов достаточно реляционных баз данных, среди которых можно выбрать подходящие бесплатные решения. Однако под некоторые специфические сценарии использования лучше подходит документоориентированная модель хранения данных.
Конечно, стоит учитывать, что сейчас многие реляционные базы данных поддерживают возможность хранения данных в формате JSON или XML, что в какой-то степени позволяет им конкурировать с документоориентированной моделью.
Если же ваш проект вырос до такого размера, когда этих решений недостаточно, имеет смысл добавлять key-value-хранилища в качестве кэша или искать другую гибридную модель управления данными.
А вот если вам необходимо построить систему аналитики с обработкой огромных объёмов данных, то, скорее всего, вам придётся рассматривать хранилища из категории OLAP. К ним относятся колонкоориентированные хранилища или хранилища категории семейства столбцов, такие как HBase или Google Cloud Bigtable.