База данных
Обычно базой данных называют какую либо СУБД (Систему Управления Базами Данных).
Основное предназначение СУБД это хранение данных, добавление, изменение и поиск. В большинстве случаев пользователь никогда не подключается напрямую к СУБД, а использует для этого промежуточный сервер (бэкенд), который отвечает за контроль доступа к данным и преобразование их в нужный формат.
Преимущество СУБД перед обычным хранением данных в файлах в том, что они обладают механизмом "индексирования", что позволяет им быстрее находить нужные записи и не использовать полный перебор всех хранимых записей.
СУБД делят на несколько типов исходя из того как они работают.
Реляционные (SQL) СУБД
Один из самых старых и популярных типов СУБД. Позволяют выполнять запросы сразу по нескольким таблицам с множеством условий. В таких СУБД данные связываются между собой по идентификатору записи. Для работы с данными необходимо предварительно создать структуру таблиц и каждому полю в таблице задать свой тип. Т.е. если при создании таблицы было создано поле типа "число", то записать в него "строку" уже не получится, а менять тип столбца не всегда возможно т.к. могут быть потеряны данные, которые не смогут сконвертироваться в новый тип.
Например для указания адреса может быть использована такая структура таблиц:
Страна - содержит название страны и уникальный ключ записи (id)
Город - список городов, у каждой записи есть отдельная колонка в которой сохраняется id страны, вместо указания ее полного названия.
Улица - список улиц, у каждой записи аналогично есть отдельная колонка с id города.
Таким образом зная улицу, по связям вверх по цепочке мы можем получить в каком городе она находится и в какой стране находится этот город.
Преимущество такого подхода состоит в том, что в случае переименования улицы или города, не нужно менять его название во всех связанных документах, а достаточно поменять только в одной записи. Также это исключает ошибку в написании значений т.е. если мы будем при создании заказа в интернет магазине вместо выбора названия улицы из таблицы каждый раз писать руками, то можем ошибиться (большие и маленькие буквы, типы - шоссе/проспект/проезд и т.п.), и в дальнейшем при машинной обработке данных это будут разные улицы.
Реляционные БД позволяют делать сложные запросы и вычисления во время запроса - например посчитать количество заказов на улице или в стране, сумму покупок, среднюю сумму заказа по городу и т.п. это позволяет ускорить работу приложения т.к. все вычисления происходят на сервере БД, а бэкенд или клиент получают уже отфильтрованные, сгруппированные, отсортированные и посчитанные данные.
MariaDB (бывшая MySQL) - используется в основном в веб проектах т.к. достаточно простая в обслуживании.
PostgreSQL - применяется в сложных или корпоративных проектах, позволяет делать более сложные запросы и имеет расширенные возможности хранения данных. Но из-за этого требуются более квалифицированные инженеры для ее поддержки.
MS SQL/Oracle Database - СУБД корпоративного класса, используются только крупными компаниями.
SQLite - встраиваемая СУБД, не используется в клиент-серверной архитектуре и используется для хранения и обработки данных у пользователя, например в браузере или мобильном приложении. Для работы СУБД не требуется отдельного приложения т.к. вся БД находится в одном файле на устройстве пользователя.
Документоориентированные (NoSQL) СУБД
В таких БД нет четкой структуры хранения, а сами записи хранятся как документы (JSON) и могут быть вложены друг в друга.
Преимущество этого типа хранения заключается в возможности увеличения количества серверов и распределения данных между ними, в отличии от реляционных СУБД у которых для выполнения запроса необходимо, чтобы все запрашиваемые данные были на одном сервере. В связи с этим используется другой подход к хранению данных по сравнению с реляционными СУБД - все необходимые для запроса данные нужно сохранять в одном документе и не использовать связанные таблицы.
Такие СУБД используются для проектов в которых большое количество одинаковых не связанных между собой записей - публикации в соцсетях, фотохостинг, чаты, новости и т.п.
MongoDB - одна из самых популярных NoSQL СУБД, ее используют GitHub, Foursqaure, CNN и др. Достаточно простая в обслуживании и масштабировании.
У MongoDB есть дополнительный особенный тип коллекций - Time-Series, который оптимизирован для хранения событий - показаний счетчиков, истории цен и т.п. записей в которых всегда присутствует дата события. Такие коллекции позволяют выполнять быстрые запросы использующие расчеты (сумма, количество, среднее значение и т.п.) и диапазоны времени.
Elasticsearch - обычно используется как временное хранилище предварительно обработанных данных, отличается высокой скоростью работы за счет хранения данных в оперативной памяти сервера и позволяет делать сложные запросы. Полезно использовать как промежуточную БД между реляционной СУБД и пользователем если используются очень сложные или частые одинаковые запросы.
Cloud Firestore - особенностью этой СУБД является возможность напрямую подключать пользователя к БД, т.к. она обладает встроенным механизмом разграничения доступа к документам. Применяется в простых мобильных приложениях, когда нужно хранить пользовательские данные - заметки, чаты, задачи, игровые данные и т.п., а также если отсутствует необходимость в полноценном бэкенде.
Нельзя установить на своем сервере т.к. является частью BaaS платформы Firebase.
Google Cloud Datastore - СУБД которая позволяет создавать неограниченные по размеру БД при этом сохраняя стабильное время ответа на запросы. Является частью IaaS платформы Google Cloud и не доступна для установки на собственный сервер.
Redis - хранит данные в виде пар ключ-значение, позволяет получать сразу несколько записей по совпадающей части ключа. Используется как кеширующая БД т.к. работает очень быстро за счет хранения всех данных в оперативной памяти сервера. Не используется как основная БД для хранения данных. Используется в высоконагруженных проектах, для того чтобы снять нагрузку с основной БД или ускорить время ответа для частых одинаковых запросов (курс валюты, погода и т.п.).