Дані це центральний елемент у роботі багатьох додатків та сайтів. Коментарі під вірусним відео, статті в блогу, ваша статистика в онлайн-іграх, товари у кошику інтернет-магазина, — все це інформація, яка зберігається десь у базі даних.
У цій статті спробуємо дати уявлення про те, для чого призначені бази даних, які вони бувають, як вписуються в загальну структуру сайтів та додатків, а також яким чином із ними зазвичай взаємодіють.
Що таке база даних
У широкому сенсі база даних — це будь-яке сховище логічно впорядкованої інформації. База даних не обов’язково повинна зберігатися на комп’ютері. Такі речі як архів з картками паціентів у лікарні, альбом з фотографіями чи папка з квитанціями також підходять під визначення бази данних.
У контексті сайтів та додатків, коли говорять «база даних», зазвичай мають на увазі комп’ютерну програму, яка дозволяє взаємодіяти з базою. Формально така програма називається система керування базою даних (СКБД). Її зазвичай встановлюють на окремий віртуальний сервер та підключаються до неї віддалено.
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.