База данных

Материал из NoCode Wiki

Обычно базой данных называют какую либо СУБД (Систему Управления Базами Данных).

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

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

СУБД делят на несколько типов исходя из того как они работают.

Реляционные (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 - хранит данные в виде пар ключ-значение, позволяет получать сразу несколько записей по совпадающей части ключа. Используется как кеширующая БД т.к. работает очень быстро за счет хранения всех данных в оперативной памяти сервера. Не используется как основная БД для хранения данных. Используется в высоконагруженных проектах, для того чтобы снять нагрузку с основной БД или ускорить время ответа для частых одинаковых запросов (курс валюты, погода и т.п.).