После публикации статьи “Какую СУБД выбрать и почему? (Статья 1)” ко мне поступили справедливые комментарии о том, что я не упомянул такие типы СУБД, как Time Series и Spatial. В этой статье я кратко опишу их и добавлю еще два типа — Search engines и Object-oriented (объектные).

Напомню, в предыдущей статье мы описали:

  • Реляционные

  • Ключ-значение

  • Документные

  • Графовые

  • Колоночные

В этой опишем:

  • Time Series

  • Spatial

  • Search engines

  • Object-oriented (объектные)

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


Time Series СУБД

Такие СУБД оптимизированы для хранения данных временных меток или временных рядов. Данные временных рядов могут содержать измерения или события, которые отслеживаются, собираются или объединяются в течение определенного периода времени. Это могут быть данные, собранные с датчиков отслеживания движения, метрики JVM из приложений Java, рыночные торговые данные, сетевые данные, ответы API, время безотказной работы процессов и т.д.

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

Наиболее известные СУБД такого типа: InfluxDB, Kdb+, Prometheus, TimescaleDB, QuestDB, AWS Timestream, OpenTSDB, GridDB.

Когда выбирать Time series СУБД

Основная область применения таких СУБД — это системы мониторинга, сбора телеметрии и финансовые системы.

Когда не выбирать Time series СУБД

Желательно воздержаться от применения такой СУБД для задач, не связанных с временными рядами и временными метками.


Объектные СУБД (Object-oriented)

Как следует из названия, такие СУБД оптимизированы под хранение и работу с объектами. Как и полагается в ООП, у таких объектов в СУБД также имеются свойства и методы. Так же в них реализованы инкапсуляция и полиморфизм. Основная цель использования объектных СУБД — избавить разработчиков, применяющих объектную модель программирования, от необходимости трансформировать объекты в таблицы, строки и их связи, и обратно.

Яркие представители этого типа СУБД: MongoDB Realm, InterSystems Caché, ObjectStore, Actian NoSQL DB, Objectivity/DB.

Когда выбирать объектные СУБД

Честно говоря, я видел не так много успешных реализаций с использованием объектных СУБД. Тем не менее, объектные базы данных обычно рекомендованы для тех случаев, когда требуется высокопроизводительная обработка данных, имеющих сложную структуру, при этом разработка ведется с использованием языков объектно-ориентированного программирования.

Когда не выбирать объектные СУБД

Не выбирайте объектную СУБД, если вы планируете использовать классический язык SQL, если вы не используете ООП или если вы планируете в дальнейшем мигрировать с данной СУБД на другие. Если нет хорошего понимания ООП, в большинстве случаев лучше выбрать документо-ориентированные СУБД.


Search engine СУБД

Такой тип СУБД используется для организации полнотекстового поиска. Причем поиск может производиться по различным данным — это например, данные из других БД, e-mail, RSS-feed, текст, JSON, XML, CSV, и даже по документам PDF и MS Office. У Search engine СУБД свои оптимизированные подходы к индексированию данных. В том числе используются так называемые инвертированные индексы, для того, чтобы предоставлять практически real-time поиск. В разных СУБД данного типа могут использоваться свои языки запросов, отличающихся друг от друга.

Известные СУБД данного типа: Apache Solr, Elasticsearch, Splunk.

Когда выбирать Search engine СУБД

Подходят для организации быстрого полнотекстового поиска по различным источникам данных, как по структурированным, так и по слабо структурированным. Яркий пример — системы сбора логов и поиска по ним.

Когда не выбирать Search engine СУБД

Если поиск производится по ограниченному количеству полей структурированных данных.


Spatial СУБД

Этот тип СУБД оптимизирован и предназначен для работы с объектами определенными в геометрическом пространстве. Это могут быть простые объекты (точки, линии, многоугольники) или сложные (3D-объекты, топологические покрытия, линейные сети). В таких СУБД реализован набор специальных функций, позволяющих проводить с объектами операции создания, трансформации, измерения (расстояния, площади, объема), вычисления (пересечений \ соприкосновений) и выборки по определенным критериям. В таких СУБД существуют специальные индексы, оптимизирующие работу с объектами, и специальный стандартизированный SQL/MM язык.

Известные представители этого типа СУБД: Oracle Spatial, Microsoft SQL, PostGIS, SpatialLite.

Когда выбирать Spatial СУБД

Если строите GIS-решения. Если планируете не просто хранить, но и работать с геометрическими объектами на уровне СУБД.

Когда не выбирать Spatial СУБД

Если планируете просто хранить геометрические объекты в виде координат.


Заключение

Мы пополнили наш перечень типов СУБД еще четырьмя: Time series, Object-oriented, Search engines и Spatial. Это все еще не полный перечень, и в одной из следующих статей мы продолжим. Отдельно рассмотрим несколько крупных вендоров, которые предлагают сразу множество типов СУБД.

Тип СУБД

Когда выбирать

Популярные СУБД данного типа

1

Реляционные

Нужна транзакционность; высокая нормализация; большая доля операций на вставку

Oracle, MySQL, Microsoft SQL Server, PostgreSQL, IBM DB2, SQLite

2

Ключ-значение

Задачи кэширования и брокеры сообщений

Redis, Memcached, etcd

3

Документные

Для хранения объектов в одной сущности, но с разной структурой; хранение структур на основе JSON

Couchbase, MongoDB, Amazon DocumentDB

4

Графовые

Задачи подобные социальным сетям; системы оценок и рекомендаций

Neo4j, Amazon Neptune, InfiniteGraph, TigerGraph

5

Колоночные

Хранилища данных; выборки со сложными аналитическими вычислениями; количество строк в таблице превышает сотни миллионов

Vertica, ClickHouse, Google BigQuery, Sybase \ SAP IQ, InfoBright

6

Time series

Системы мониторинга, сбора телеметрии, и финансовые системы, с привязкой к временным меткам или временным рядам

InfluxDB, Kdb+, Prometheus, TimescaleDB, QuestDB, AWS Timestream, OpenTSDB, GridDB

7

Объектные

Высокопроизводительная обработка данных, имеющих сложную структуру, с использованием языков объектно ориентированного программирования

MongoDB Realm, InterSystems Caché, ObjectStore, Actian NoSQL DB, Objectivity/DB

8

Search engine

Системы полнотекстового поиска

Apache Solr, Elasticsearch, Splunk

9

Spatial

GIS-решения, работа с геометрическими объектами

Oracle Spatial, Microsoft SQL, PostGIS, SpatialLite

Большое спасибо всем за комментарии и правки, особенно @mentin, @jenki, @jobgemws, @funny_falcon, @MilashchenkoEA, @UncleJo, @Odmino, @Dansoid, @Jovanny, @Dotarev, @raven19, @stgunholy, @Dansoid, @apapacy

Всегда рад конструктивной критике.

Комментарии (15)


  1. SlyFoxMan
    04.10.2021 18:25
    +2

    Я бы к списку популярных TSDB добавил бы еще VictoriaMetrics.


    1. DenisOmg
      04.10.2021 18:44
      +2

      А к графовым — DGraph


      1. YevSam Автор
        04.10.2021 19:09

        Спасибо за дополнение.

        Да, согласен, тоже интересная СУБД - особенно интересно было почитать реальные use cases у них на сайте.

        СтОит добавить в таблицу.


    1. YevSam Автор
      04.10.2021 18:47
      +1

      Спасибо за комментарий!

      Почитал про VictoriaMetrics - выглядит достойно. Добавлю ее в таблицу.


  1. korsetlr473
    04.10.2021 20:03
    +2

    Интересно услышать ваше мнение какую базу применить как писал человек выше?

    Отношение "Post - Likes"

    Кол-во: десятки миллионов записей для 1 поста у популярных людей

    Множество запросов: "лайкнул ли User1 Post2 ?"


    1. YevSam Автор
      06.10.2021 17:37

      Приветствую!

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

      Если я правильно понимаю, то вводные такие:
      1. Есть три сущности - Люди, Посты, Лайки.
      2. Самая крупная таблица (десятки миллионов записей на 1 пост) - Лайки, в которой есть ссылка на таблицы Люди, и Посты.
      3. В таблицу Лайки производятся вставки. Удалений нет, изменений нет.
      4. Поддерживать транзакционность необязательно

      Из этих вводных вполне подходит классическая реляционная база данных.
      В качестве эксперимента, я создал минимально-возможную в AWS конфигурацию
      Serverless Aurora MySQL, создал в ней три сущности с индексами и foreign keys. Заполнил таблицы примерно по 20 млн строк, и выполнил запросы - отрабатывает моментально.

      При этом никакой магии с партициями или запросами, все стандартно.

      Итого, я бы рекомендовал использовать все таки реляционную СУБД.


  1. mentin
    04.10.2021 20:57
    +2

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

    Скажем, насчет Spatial - все больше аналитики требует работы с географией, поэтому ее все добавляют понемногу. Google BigQuery пару лет назад поддержал Spatial, и стал видимо наиболее масштабируемой на текущий момент аналитической базой данных для больших пространственных данных. Сейчас то же сделал Snowflake, расширили поддержку RedShift и Athena.

    Пожалуй только транзакционные и аналитические базы данных пока разделены прорвой, но и там SingleStore (бывший MemSQL) пытается продавать интегрированное решение.


  1. SergeKh
    04.10.2021 21:46
    +3

    Из поисковых баз данных люди весьма активно используют sphinx, он гораздо быстрее чем эластик, хотя и менее удобен в настройке и менее функционален. "Гораздо" это как минимум в несколько раз, а иногда и в 10. В общем круто быстрее.


    1. Fafhrd
      04.10.2021 22:58
      +2

      Да, Шодан хорошую работу провел, я от эластика окончательно отказался, когда реалтаймовые индексы появились. А работа с поиском через стандартный мускульный клиент это что-то.


  1. scorpka
    04.10.2021 22:44
    +1

    Жду статью№3, где будет объяснено что из этих трёх выбрать: оракл, постгрес, или мария дб


    1. Fafhrd
      04.10.2021 22:54

      из этих трех надо выбирать мсскл (нет)


    1. hard_sign
      05.10.2021 10:03
      +1

      То, что вы перечислили, платформы одного класса, которые решают одни и те же задачи. Поэтому выбор тут исключительно по нефункциональным требованиям – стоимость, производительность, отказоустойчивость. Если высокая интенсивность обновлений и/или высокие требования к отказоустойчивости, то Oracle или PostgreSQL. Oracle существенно дороже, но и возможности вертикального масштабирования у него гораздо больше. Плюс Oracle может конкурировать и в нише аналитических БД с такими платформами как Greenplum, Teradata, Netezza (которая puredataforanalytics), MS PDW. Если один пишет, а многие читают, то тут какой-то из клонов MySQL – мария, перкона, сам мускл...


    1. YevSam Автор
      06.10.2021 17:41

      Спасибо за комментарий!
      Вопрос не тривиальный, многое зависит от конкретной задач и ограничений.

      Если есть чуть больше вводных, можем обсудить.


  1. ggo
    05.10.2021 11:09

    Помимо упомянутых критериев есть прочие:

    • горизонтальное масштабирование

    • in-memory

    • особенности реализации CAP

    • и т.д.


  1. UncleJo
    11.10.2021 16:12
    +1

    Кстати, в MS SQL 2019 имеется модуль для работы с графовыми данными.