Данные это центральный элемент в работе многих приложений и сайтов. Комментарии под вирусным видео, статьи в блоге, ваша статистика в онлайн-играх, товары в корзине интернет-магазина, — всё это информация, которая хранится где-то в базе данных.
В этой статье попытаемся дать представление о том, для чего предназначены базы данных, какие они бывают, как вписываются в общую структуру сайтов и приложений, а также каким образом с ними обычно взаимодействуют.
Что такое база данных
В широком смысле, база данных — это любое хранилище логически упорядоченной информации. База данных не обязательно должна храниться на компьютере. Такие вещи как архив с карточками пациентов в больнице, альбом с фотографиями или папка с квитанциями тоже подходят под определение базы данных.
В контексте сайтов и приложений, когда говорят «база данных», обычно имеют в виду компьютерную программу, которая позволяет взаимодействовать с базой. Формально такая программа называется «система управления базой данных (СУБД)». Её обычно устанавливают на отдельный виртуальный сервер и подключаются к ней удалённо.
Redis, MariaDB, MySQL, PostgreSQL — это примеры СУБД, но вообще, есть также много других вариантов. Разные СУБД обычно имеют свои уникальные особенности и наборы инструментов, но их можно грубо разделить на две категории: реляционные и нереляционные.
Реляционные базы данных
С 70-х годов многие СУБД разрабатываются на основе реляционной модели. Понятие «реляционный» происходит от английского слова «relation» (зависимость, отношение, связь). Эти зависимости представляют собой строки (кортежи) в таблицах, каждая из которых имеет общий набор столбцов (атрибутов).

Каждую строку в таблице можно представить как уникальный экземпляр для людей, объектов, событий или связей, которые хранит таблица. Эти экземпляры могут быть, например, сотрудниками компании, продажами интернет-магазина или результатами анализов в медицинской лаборатории.
Например, в таблице, содержащей записи об учителях школы, строки могут иметь такие атрибуты, как name (имя), subjects (предметы), start_date (дата начала работы) и т. д.
В реляционной базе данных каждая таблица содержит как минимум один столбец с уникальным идентификатором строки, он называется primary key (первичный ключ).
Продолжая пример с таблицей об учителях школы, администратор базы данных может создать столбец первичного ключа с названием employee_ID (номер сотрудника) и последовательно возрастающими значениями. Это позволит СУБД отслеживать записи и возвращать их по запросу. Таким образом, записи не будут иметь определённого логического порядка, а пользователи смогут получать данные в любом порядке или с использованием любых фильтров.
Если у вас есть две таблицы, которые вы бы хотели связать друг с другом, это можно сделать при помощи такого понятия как foreign key (внешний ключ). По сути это копия первичного ключа одной таблицы (материнской), который разместили в другой таблице (дочерней).
На скриншоте ниже вы можете увидеть иллюстрацию такой взаимосвязи. В одной таблице хранится информация про сотрудников компании, а в другой — информация о продажах. Первичный ключ таблицы EMPLOYEES (сотрудники) используется в качестве внешнего ключа в таблице SALES (продажи).

Реляционные базы данных позволяют организованно хранить данные, но в этом есть смысл только тогда, когда эти данные можно извлечь. Чтобы извлечь информацию из реляционной СУБД, нужно выполнить специальный запрос. Большинство реляционных баз данных используют для этого язык под названием SQL (Structured Query Language).
SQL позволяет фильтровать и обрабатывать результаты запросов с помощью разных условий, функций и выражений, обеспечивая точный контроль над тем, какие данные будут включены в ответ на запрос.
Примеры самых популярных сегодня реляционных СУБД: MySQL, MariaDB, PostgreSQL, SQLite.
Нереляционные базы данных
Сегодня большинство приложений до сих пор полагается на реляционную модель для хранения и организации данных. Но эта модель не может удовлетворить потребности каждого приложения. Например, у реляционных баз есть трудности с горизонтальным масштабированием данных, и хотя они идеальны для хранения структурированной информации, с хранением неструктурированной справляются хуже.
Эти и другие ограничения реляционной модели привели к разработке альтернативных решений. Общее название таких моделей баз данных — нереляционные базы данных. Поскольку эти альтернативные модели обычно не используют SQL для добавления и извлечения данных, их иногда называют NoSQL базами данных. Это означает, что многие базы данных NoSQL используют свой уникальный синтаксис.
Стоит воспринимать термины «NoSQL» и «нереляционный» как собирательные. Есть много баз данных, которые называют NoSQL, но между ними существенные различия. Дальше в этом разделе в общих чертах рассмотрим несколько основных подвидов нереляционных баз.
Базы данных «ключ-значение»
Базы данных «ключ-значение» предназначены для хранения и управления ассоциативными массивами. Ассоциативный массив, также известный как «словарь» или «хеш-таблица», состоит из набора пар «ключ-значение», где ключ это уникальный идентификатор для извлечения связанного значения. Значениями могут быть как простые объекты, такие как целые числа или строки, так и что-то более сложное, например, структуры JSON.
Redis — пример популярной базы данных «ключ-значение».
Документо-ориентированные базы данных
Документо-ориентированные базы данных или хранилища документов это NoSQL базы данных, которые хранят данные в формате документов. Такие базы данных являются разновидностью модели «ключ-значение»: у каждого документа есть уникальный идентификатор — ключ, а сам документ выступает в роли значения.
Основное отличие между этими моделями заключается в том, что в базах данных «ключ-значение» данные рассматриваются как непрозрачные. То есть база данных не знает и не учитывает их содержимое; это задача приложения — интерпретировать хранимые данные. А в хранилище документов у каждого документа есть метаданные, которые придают данным некоторую структуру.
Такие хранилища часто оснащены API или языком запросов, позволяющим извлекать документы на основе их метаданных. Они также поддерживают сложные структуры данных, в которых документы могут быть вложенными друг в друга.
MongoDB — широко используемая документная база данных. Документы, которые вы храните в MongoDB записываются в формате BSON, который представляет собой двоичную форму JSON.
Столбцовые базы данных
Столбцовые базы данных, также известные как колоночные, это системы баз данных, которые хранят данные в столбцах. Это может показаться похожим на традиционные реляционные базы, но вместо того чтобы группировать столбцы в таблицы, каждый столбец хранится в отдельном файле или области в хранилище системы.
Данные, которые хранятся в столбцовой базе данных, представлены в порядке записи. Первый элемент в одной колонке связан с первым элементом в других колонках. Такая структура позволяет запросам считывать только нужные колонки, а не обрабатывать каждую строку в таблице и отбрасывать ненужные данные после их загрузки в память.
Apache Cassandra — популярная столбцовая база данных с открытым кодом.
Базы данных как часть приложения
Сами по себе системы управления базами данных не очень удобны. Конечно, можно использовать СУБД, чтобы взаимодействовать с базой напрямую, но в реальной жизни их чаще всего используют в комбинации с другими технологиями, потому что СУБД не умеет сама выводить содержимое на экраны. В результате база данных становится важным компонентом более крупного приложения.
Есть несколько популярных наборов технологий (стеков, от англ. stack — стопка, набор), в состав которых входит СУБД. Вот пара примеров:
- LAMP. Это аббревиатура, состоящая из технологий, которые входят в этот набор: операционная система Linux, веб-сервер Apache, база данных MySQL и язык PHP для обработки динамического контента. Также бывает, что отдельные компоненты этого набора заменяют на другие. Допустим, Nginx вместо Apache, PostgreSQL или SQLite вместо MySQL, Flask или Django вместо PHP. От этого может также варьироваться сама аббревиатура. Например, не LAMP, а LEMP, если вместо Apache используется Nginx (произносится engine-x).
- Elastic. Также известный под аббревиатурой ELK, этот набор технологий выстроен вокруг ElasticSearch — поискового движка, который также описывают как документо-ориентированную базу данных. Его часто используется для масштабируемого хранения логов программного обеспечения.
Эти наборы технологий часто размещают на одном сервере — такой подход называют монолитной архитектурой. В таких случаях подключить компоненты стека к СУБД достаточно просто. Альтернативный вариант — настроить удалённую базу данных, установив СУБД на удалённом сервере.
Многие СУБД используют выделенный порт, через который сервер приложения может подключаться к удалённой базе данных. Например, для MySQL стандартный порт — 3306, а для Redis — 6379. Удалённый сервер базы данных может быть более удобным решением для масштабирования по сравнению с монолитной архитектурой, поскольку базу данных можно будет масштабировать отдельно от приложения.
Однако, удалённая база данных увеличивает потенциал для атаки на приложение, поскольку создаёт больше точек входа для несанкционированных пользователей. Кроме того, ваши данные должны передаваться по сети от сервера базы данных к серверу приложения, что делает их уязвимыми для перехвата.
Чтобы защитить данные от таких атак, многие СУБД поддерживают шифрование. Это когда исходный текст (plaintext) преобразовывают в шифрованный текст (ciphertext), в результате чего он становится нечитаемым и может быть расшифрован только с использованием правильного ключа. Если злоумышленник перехватит зашифрованные данные, он не сможет их прочитать, пока не расшифрует.
Данные будут использовать шифрование, если выбрать в настройках СУБД, что все соединения должны использовать протокол Transport Layer Security (TLS). Как и его предшественник Secure Sockets Layer (SSL), TLS — это криптографический протокол, который использует аутентификацию на основе сертификатов.
Важно отметить, что TLS шифрует данные только в процессе передачи. Даже если вы включите в настройках MongoDB использование TLS для всех соединений, статические данные, которые просто хранятся в базе, не будут зашифрованы, если ваша СУБД не поддерживает шифрование и таких данных тоже.
Как работать с базами данных
У многих систем управления базами данных есть своя утилита для командной строки, при помощи которой можно взаимодействовать с базой. Например, для MySQL это mysql, для PostgreSQL — psql, а для MongoDB — MongoDB Shell.
Существуют также сторонние клиенты командной строки для многих СУБД. Один из таких примеров — Redli, который является альтернативой стандартному инструменту Redis (redis-cli) и предлагает дополнительные возможности.
Управлять базой данных из командной строки может быть удобно не для всех, поэтому для многих СУБД есть также графические интерфейсы. Например, phpMyAdmin или pgAdmin это браузерные варианты, а MySQL Workbench или MongoDB Compass — десктопные программы для локального компьютера.
По мере того как приложение развивается и растёт, данным в базе будет нужно всё больше места. Это может дойти до такой степени, что работа приложения замедлится. Для того чтобы справиться с этой проблемой, есть несколько стратегий. Две самых распространённых из них это репликация (replication) и фрагментация (sharding).
Репликация это когда данные синхронизируют между несколькими отдельными базами данных. Это полезно по нескольким причинам: 1) если одна БД станет недоступна, у вас будет резервная копия; 2) при наличии нескольких баз снизятся задержки при чтении; 3) из-за дополнительных копий базы можно больше её масштабировать.
Многие СУБД, включая MongoDB и MySQL, имеют встроенные функции репликации. Например, MySQL предоставляет несколько методов репликации, что даёт большую гибкость.
Фрагментация это когда записи, которые обычно хранятся в одной базе, распределяют между несколькими машинами (фрагментами). Такой подход особенно полезен при работе с большими объёмами данных, так как позволяет масштабировать базу горизонтально.
Что дальше
Надеемся, статья помогла вам лучше понять, что такое базы данных и как их используют. Давайте кратко повторим основные моменты:
- База данных (БД) — это хранилище взаимосвязанной информации, организованной определённым образом. Программа, которая позволяет взаимодействовать с базой, называется системой управления базой данных (СУБД). Примеры СУБД: MySQL, PostgreSQL, Redis, MongoDB.
- Бывают реляционные и нереляционные базы данных. Реляционные базы хранят данные в таблицах с чёткой структурой (строки и столбцы), используют SQL для управления. Нереляционные базы хранят данные в гибких форматах (документы, ключ-значение, графы и т.д.), не требуют строгой схемы и часто используют альтернативы SQL.
- Отдельно базы данных не используют, обычно они входят в набор технологий (стек), необходимый для работы приложения. Самый популярный стек — LAMP: Linux, Apache, MySQL, PHP. Есть много других вариаций этого стека с другими технологиями (например, Nginx, Python, MongoDB), а также много других стеков.
- Работают с базами данных либо через консоль при помощи уникальных для каждой базы утилит (mysql, psql, redis-cli), либо в графическом интерфейсе при помощи специальных программ (phpMyAdmin, MySQL Workbench, MongoDB Compass).
- Основная проблема в работе баз данных — масштабирование. Когда по мере развития проекта база разрастается и нарушает продуктивность работы сайта. Для этого либо создают её копию (репликация), либо разбивают её на части (фрагментирование).
- Безопасность базы данных — тоже важный момент. Нельзя допустить, чтобы к данным в базе получил доступ злоумышленник. Для этого обычно используют криптографическое шифрование по протоколу TLS.