Алекс СЮЙ

Разбираемся в типах
баз данных

Оригинал

Перевод и редактура: Анна Иванова и Софья Должанская
Успех приложения часто зависит от выбора правильной базы данных. Как разработчики, мы сталкиваемся с огромным количеством вариантов баз данных. Для нас очень важно понимать разницу между ними и то, как выбрать варианты, которые лучше всего соответствуют требованиям нашего проекта. В сложных приложениях обычно используется несколько различных баз данных, каждая из которых отвечает определённому аспекту потребностей приложения.

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

На протяжении всей серии мы рассмотрим ключевые шаги в процессе выбора базы данных и разберём примеры, демонстрирующие успешный выбор базы данных на практике. К концу цикла мы постараемся расширить свои возможности с помощью знаний и уверенности, необходимых для того, чтобы овладеть искусством выбора правильной комбинации баз данных для наших сложных приложений.

SQL vs. NoSQL. Источник

Разбираемся в типах баз данных

Чтобы принять оптимальное решение для наших проектов, важно изучить различные типы баз данных, доступные на рынке. В этом разделе мы рассмотрим ключевые характеристики нескольких типов баз данных, включая популярные виды каждого из них, и сравним варианты их использования.

Реляционные базы данных
Реляционные (relational) базы данных основаны на реляционной модели, которая организует данные в таблицы со строками и столбцами. Эти базы данных стали стандартным выбором для многих приложений благодаря их строгой согласованности, поддержке сложных запросов и соблюдению свойств ACID (Atomicity, Consistency, Isolation, Durability — атомарность, согласованность, изолированность, долговечность). Ключевые особенности и преимущества реляционных баз данных включают:

  • Структурированная организация данных: данные в реляционных базах данных хранятся в таблицах с заранее определённой схемой, что обеспечивает согласованную структуру всей базы данных. Такая организация облегчает управление и поддержку, особенно при работе с большими объёмами структурированных данных.

  • Связи и ссылочная целостность: связи между таблицами в реляционной базе данных определяются первичными и внешними ключами, что обеспечивает ссылочную целостность. Эта функция позволяет эффективно выполнять запросы к связанным данным и поддерживает сложные взаимосвязи данных.

  • Поддержка SQL: реляционные базы данных используют язык структурированных запросов (SQL) для запросов, манипулирования и управления данными. SQL — это мощный и широко распространённый язык, который позволяет разработчикам выполнять сложные запросы и манипуляции с данными.

  • Транзакции и свойства ACID: реляционные базы данных поддерживают транзакции, представляющие собой наборы связанных операций, которые либо завершаются успешно, либо терпят неудачу как единое целое. Эта функция обеспечивает соблюдение свойств ACID (Atomicity, Consistency, Isolation, and Durability), гарантирующих согласованность и целостность данных.

  • Индексирование и оптимизация: Реляционные базы данных предлагают различные методы индексирования и стратегии оптимизации запросов, которые помогают повысить производительность запросов и снизить потребление ресурсов.

Реляционные базы данных имеют и некоторые недостатки:

  • Ограниченная масштабируемость: масштабирование реляционных баз данных по горизонтали (добавление новых узлов) может быть затруднено, особенно по сравнению с некоторыми базами данных NoSQL, предназначенными для распределённых сред.

  • Жёсткость: предопределённая схема реляционных баз данных может затруднить адаптацию к изменяющимся требованиям, поскольку изменение схемы может потребовать значительных модификаций существующих данных и приложений.

  • Проблемы с производительностью при работе с большими массивами данных: по мере роста объёма данных реляционные базы данных могут испытывать проблемы с производительностью, особенно при работе со сложными запросами и масштабными манипуляциями с данными.

  • Неэффективны для неструктурированных или полуструктурированных данных: реляционные базы данных предназначены для структурированных данных. Они могут не подойти для управления неструктурированными или слабоструктурированными данными, такими как данные социальных сетей или данные датчиков.

К популярным реляционным базам данных относятся MySQL, PostgreSQL, Microsoft SQL Server и Oracle. Каждый из этих вариантов имеет свои уникальные особенности, сильные и слабые стороны, что делает их подходящими для разных случаев использования и требований. При выборе реляционной базы данных необходимо оценить специфические потребности приложения с точки зрения согласованности данных, поддержки сложных запросов, масштабируемости и других факторов.

NoSQL
NoSQL базы данных были разработаны как ответ на ограничения реляционных баз данных, особенно в области масштабируемости, гибкости и производительности при определённых условиях. В отличие от реляционных баз данных, NoSQL базы не придерживаются строго реляционной модели или традиционного табличного хранилища. Они могут хранить данные в различных форматах, что делает их пригодными для самых разных случаев использования. NoSQL базы данных можно разделить на четыре подтипа, каждый из которых имеет свои уникальные характеристики:

  • Документо-ориентированные (Document-based) базы данных хранят данные в слабоструктурированных (semi-structured) документах, таких как JSON или BSON. Этот формат обеспечивает большую гибкость моделирования данных. Это позволяет создавать более динамичные схемы, которые могут развиваться по мере изменения требований приложения. Документо-ориентированные базы данных хорошо подходят для приложений, работающих с иерархическими или вложенными структурами данных, таких как системы управления контентом, платформы электронной коммерции и аналитические приложения. Примеры популярных документо-ориентированных баз данных — MongoDB и Couchbase.

  • Столбцово-ориентированные (Column-based) базы данных, также известные как хранилища с широкими столбцами (wide-column store) или хранилища семейств столбцов (column-family store), организуют данные в столбцах, а не в строках. Эта структура оптимизирует запросы на основе столбцов, обеспечивая улучшенное сжатие и лучшую производительность чтения. Столбцово-ориентированные базы данных предназначены для приложений, которым требуется NoSQL для хранения и запроса больших объёмов данных на многих узлах, что делает их популярным выбором для приложений, работающих с большими данными и аналитикой, а также приложений с высокими нагрузками на запись и чтение. Некоторые известные столбцово-ориентированные базы данных — Apache Cassandra и HBase.

  • Хранилища «ключ-значение» (Key-value stores) предоставляют простой и эффективный способ хранения данных в виде пар «ключ-значение». Эти базы данных идеально подходят для случаев использования, требующих высокоскоростного чтения и записи, а также горизонтальной масштабируемости. Хранилища «ключ-значение» могут служить, помимо прочего, в качестве уровней кэширования, хранилищ сеансов или хранилища конфигурации. Они часто используются в приложениях, где производительность и доступ к данным с низкой задержкой имеют решающее значение, например, в игровых платформах, системах аналитики в реальном времени и системах рекомендаций. Примеры популярных хранилищ «ключ-значение» включают Redis и Amazon DynamoDB.

  • Графовые (Graph) базы данных ориентированы на хранение данных в виде узлов и ребер графа. Это обеспечивает эффективную обработку сложных отношений, обходов и алгоритмов на основе графов. Этот тип баз данных особенно полезен для приложений, которые включают сложные отношения между объектами, таких как социальные сети, системы обнаружения мошенничества и механизмы рекомендаций. Графовые базы данных предоставляют мощные возможности запросов для перемещения и анализа взаимосвязанных данных, что делает их привлекательным выбором для таких случаев использования. Neo4j и Amazon Neptune являются примерами графовых баз данных.

Важно отметить, что NoSQL базы данных имеют свой набор недостатков:

  • Недостаток стандартизации: в отличие от реляционных баз данных, которые используют стандартизированный язык запросов SQL, базы данных NoSQL часто используют свои собственные языки запросов или API. Это может привести к увеличению времени обучения и трудностям при миграции между различными NoSQL базами данных или их интеграции с другими системами.

  • Более слабая согласованность. Многие NoSQL базы данных используют модели конечной согласованности для достижения более высокой производительности и доступности. Хотя это может подойти для некоторых приложений, это может вызвать проблемы в тех случаях, когда требуется строгая согласованность данных.

  • Ограниченная поддержка сложных запросов и транзакций. Некоторые NoSQL базы данных, такие как хранилища «ключ-значение» и столбцово-ориентированные базы данных, не предназначены для сложных запросов или транзакций с несколькими записями. Это может затруднить реализацию определённой бизнес-логики или требований к отчётности непосредственно в базе данных.
Каждый подтип NoSQL имеет свои сильные и слабые стороны, что делает их подходящими для различных приложений в зависимости от конкретных требований. При выборе NoSQL базы данных важно оценить конкретные потребности приложения с точки зрения масштабируемости, моделирования данных, шаблонов запросов и производительности, чтобы определить наилучшее решение.
NewSQL
NewSQL базы данных — это современный подход к объединению сильных сторон реляционных и NoSQL баз данных. Они придерживаются реляционной модели, свойств ACID и поддерживают SQL, предлагая при этом улучшенную масштабируемость, распределённую архитектуру и повышение производительности, обычно связанное с NoSQL базами данных. NewSQL предназначены для решения задач современных приложений, таких как обработка крупномасштабных, распределённых и многопараллельных рабочих нагрузок, без ущерба для согласованности и целостности данных.

  • Распределённая архитектура: NewSQL — распределённые базы данных. Они используют секционирование и репликацию данных между несколькими узлами или даже центрами обработки данных. Эта архитектура обеспечивает лучшую отказоустойчивость, высокую доступность и глобальный масштаб.

  • Масштабируемость: NewSQL могут масштабироваться горизонтально. Они справляются с возросшими рабочими нагрузками за счёт добавления в систему большего количества узлов. Эта функция делает их подходящими для приложений, которым требуется строгая согласованность и способность обрабатывать большой объём транзакций или пользователей.

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

  • Поддержка и совместимость SQL: сохраняя знакомый язык SQL для запросов и манипулирования данными, NewSQL базы данных упрощают процесс обучения для разработчиков. Они часто обеспечивают совместимость с существующими реляционными базами данных и инструментами, упрощая процесс миграции.

Важно учитывать недостатки NewSQL:

  • Сложность: распределённая архитектура и расширенные функции NewSQL баз данных могут усложнить настройку, обслуживание и устранение неполадок по сравнению с традиционными реляционными базами данных.

  • Привязка к поставщику: некоторые NewSQL базы данных предлагаются в качестве обслуживаемых сервисов конкретными поставщиками, что может привести к привязке к поставщику и ограничить гибкость при смене поставщиков.

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

Популярные NewSQL базы данных включают CockroachDB, Google Spanner и TiDB. Каждый вариант предлагает уникальные функции и возможности, что делает их подходящими для различных случаев использования и требований. При выборе NewSQL базы данных важно оценить конкретные потребности приложения с точки зрения масштабируемости, согласованности данных, производительности и осведомленности разработчиков, чтобы определить наиболее подходящий вариант.
Временные ряды
Базы данных временных рядов (Time-series database) специализируются на управлении данными с временными метками, которые характеризуются своей последовательностью и последовательностью, основанной на времени. Временной ряд используется во многих областях, таких как финансовые рынки, Интернет вещей и мониторинговые системы. Эти базы данных созданы для того, чтобы оптимизировать хранение, восстановление и анализ временных рядов. Они предлагают функции, которые решают уникальные задачи, представленные временными рядами.

  • Высокая производительность записи и выполнения запросов: базы данных временных рядов оптимизированы для управления высокоскоростными потоками данных, которые требуют высокоэффективной производительности при записи. Они также предоставляют быстрое выполнение запросов, поддерживая анализ временных рядов в реальном времени или почти в реальном времени (near-real-time).

  • Сжатие данных: из-за большого объёма данных, генерируемых рабочими нагрузками временных рядов, базы данных временных рядов используют различные методы сжатия данных, чтобы снизить требования к хранению и повысить производительность запросов.

  • Политики хранения данных на основе времени: базы данных временных рядов позволяют легко управлять политиками хранения данных на основе времени. Эта функция позволяет автоматически состаривать данные, что помогает поддерживать эффективность хранения и обеспечивать актуальность данных.

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

  • Масштабируемость: базы данных временных рядов предназначены для горизонтального масштабирования, что позволяет им обрабатывать большие объёмы данных и высокую скорость приема. Эта функция важна для приложений, которым необходимо хранить и анализировать огромные объемы данных временных рядов, таких как приложения Интернета вещей или системы мониторинга.

Популярные базы данных временных рядов включают InfluxDB и TimescaleDB. Каждый из этих вариантов предлагает уникальные функции и возможности, предназначенные для управления и анализа данных временных рядов, что делает их подходящими для различных вариантов использования и требований. При рассмотрении базы данных временных рядов важно оценить конкретные потребности приложения с точки зрения скорости приема данных, производительности запросов, хранения данных и масштабируемости.
Чтобы сравнить типы баз данных и варианты их использования, мы должны учитывать различные факторы, такие как тип данных, которые они обрабатывают, их масштабируемость, производительность, согласованность и сложность. Например, реляционные базы данных обычно лучше подходят для приложений, требующих строгой согласованности данных и сложных запросов, тогда как NoSQL базы данных больше подходят для проектов, работающих с большими объёмами неструктурированных данных или требующих высокой масштабируемости.

В следующем разделе мы более подробно рассмотрим факторы, которые необходимо учитывать при выборе базы данных, включая масштабируемость, производительность, согласованность данных, безопасность модели данных, стоимость и поддержку сообщества. Понимая сильные и слабые стороны каждого типа базы данных и согласовывая их с требованиями нашего проекта, мы можем принять обоснованное решение, которое поможет обеспечить успех наших усилий по разработке программного обеспечения.