nmk

Лекція 10 (2 години). Вступ до баз даних та PhpMyAdmin

План лекції

  1. Призначення Реляційних Баз Даних (RDBMS). Чому не просто текстові файли?
  2. Логічна архітектура бази: Таблиці, Стовпці (Поля), Рядки (Записи).
  3. Графічний інтерфейс phpMyAdmin: огляд інструменту.
  4. Проєктування першої таблиці users: типи даних (VARCHAR, INT), первинний ключ (Primary Key - id) та Auto Increment.

Перелік умовних скорочень

Вступ

Сесії ідеальні для тимчасової пам’яті (пам’ятати користувача доки він не вийде з акаунту або не закриє браузер). Проте, якщо сервер перезавантажиться чи впаде — всі файли сесій зникнуть назавжди. Щоб зберігати мільйони анкет, коментарів чи товарів “на віки”, щоб вони не зникали при вимкненні світла або оновленні коду, потрібне надійне і швидке “Сховище” (Storage). Таким сховищем для 90% вебсайтів виступає База Даних. У цій лекції ми розберемо структуру БД MySQL, яка постачається у складі XAMPP/MAMP, і створимо в ній нашу першу архітектурну таблицю візуальними інструментами (без написання складного коду).


1. Реляційні Бази Даних (RDBMS): Чому вони потрібні?

Чому ми не можемо просто взяти і зберігати всіх зареєстрованих користувачів у звичайному .txt або Excel (csv) файлі звичайними засобами PHP (file_put_contents)?

  1. Швидкість (Індексація): Щоб знайти одного користувача ivan@mail у текстовому файлі на мільйон рядків, інтерпретатору PHP доведеться прочитати і перебрати всі 999 999 рядків зверху донизу. Це займає секунди. Сервер Баз ДАНИХ (наприклад MySQL) має спеціальні бінарні дерева індексів і знайде його за <0.001 мілісекунди.
  2. Паралелізм (Concurrency): Якщо 20 людей одночасно натиснуть кнопку “Купити” на сайті у “Чорну П’ятницю”, Спроба одночасно переписати 1 текстовий файл .txt 20-ма процесами в PHP закінчиться катастрофічним збоєм (Lock Error) або втратою частини оплат. MySQL розроблена для тисяч ОДНОЧАСНИХ підключень без втрати даного ані байта долі.
  3. Мова запитів (SQL): У базі можна зробити запит: “Відфільтруй мені всі товари категорії X, які дешевше $50, і відсортуй за рейтингом від А до Я” одним єдиним рядком коду замість десятків складних foreach PHP циклів!

Найпопулярніші у вебі бази — Реляційні (Relational - ті, що встановлюють зв’язки/співвідношення між різними сутностями). MySQL (або її сестра MariaDB) — світовий стандарт де-факто для PHP-застосунків.

2. Логічна архітектура: База -> Таблиця -> Стовпець -> Рядок

Сервер бази даних (MySQL Workbench або ваш локальний XAMPP сервер MariaDB) — це величезний “будинок” (Система). Він може обслуговувати одразу кілька проектів одночасно.

Ієрархія зберігання:

  1. База даних (Database / Schema): Окрема “шафа”. Один сайт (Один інтернет-магазин) = зазвичай ОДНА База Даних. Ми називаємо її, наприклад shop_db.
  2. Таблиці (Tables): “Полиці” в цій шафі. Вони групують сутності. В БД shop_db ми створюємо таблицю users (користувачі) і окремо поруч незалежну таблицю products (товари).
  3. Стовпці (Columns / Fields): Це “Правила” таблиці. Проєктуючи таблицю, ми зобов’язані жорстко визначити її “шапку”: Наприклад, name, price, description. Ми не можемо просто вставити в рядок ціну і кількість, не створивши під них стовпці у таблиці (Ця жорсткість є відмінністю Реляційних баз формату SQL від гнучких NoSQL, таких як MongoDB).
  4. Рядки (Rows / Records / Записи): Це, власне, самі реальні дані. 1 новий зареєстрований клієнт (Іван) = це 1 горизонтальний доданий рядок.

3. Графічний інтерфейс phpMyAdmin

Управляти Базою Даних і створювати таблиці можна виключно командами-запитами з терміналу: CREATE TABLE users (id INT, name VARCHAR);. Це важко, якщо ви цього не робите щодня. Тому веб-розробники використовують найвідоміший у світі клієнт для управління базами через зручний браузерний інтерфейс (з кнопочками) — програму phpMyAdmin (Вона, до речі, повністю написана на PHP).

Як запустити phpMyAdmin:

  1. У панелі управління вашого XAMPP або MAMP ви повинні обов’язково запустити модуль MySQL (кнопка Start поруч). (За замовченням він працює на порту 3306).
  2. Запустіть модуль Apache (веб-сервер).
  3. В адресному рядку браузера відкрийте адресу: http://localhost/phpmyadmin/. Або просто натисніть кнопку “Admin” навпроти модуля MySQL у панелі XAMPP.

Там ви побачите дерево баз даних зліва і робочу зону справа. Ви можете клікнути “Створити (New)” -> написати ім’я БД (напр., task_manager) і обрати кодування. ОБОВ’ЯЗКОВО завжді обирайте кодування utf8mb4_unicode_ci, щоб база могла зберегати не лише латиницю, а й кирилицю та емодзі 😜!

4. Проєктування першої таблиці users та Типи даних

Відкривши створену базу даних, phpMyAdmin відразу запропонує “Створити нову таблицю (Create Table)”. Давайте спроєктуємо таблицю users (4 колонки).

Кожен стовпець потребує розуміння Типу Даних. База даних зберігає дані в максимально “стиснутому” та оптимізованому для пам’яті вигляді.

Первинний Ключ (Primary Key) та A_I

У таблиці можуть бути два Олександри Петренка (однакове і ім’я, і пароль, наприклад, збіглися). Як серверну систему пізніше сказати базі: “Видали МЕНІ З ЦЬОГО СПИСКУ того Олександра, що реєструвався першим?”. Як їх відрізнити, якщо їхні текстові дані ідентичні?

Для вирішення цієї проблеми у кожної грамотної таблиці ОБОВ’ЯЗКОВО повинен бути особливий стовпець “Паспорту” — унікальний ідентифікатор, який ніколи в житті не повторюється. Зазвичай його так і називають id (або user_id).

  1. Йому задають тип INT.
  2. Навпроти нього ставлять спеціальну галочку-настройку: Primary Key (A_I – Auto Increment).

Що робить увімкнений Auto Increment? Вам більше не треба як розробнику думати: “А який ID мені присвоїти новому Васі, щоб він не співпав ні з ким?”. Ви взагалі (ніколи) не надсилаєте стовпець id зі своєї PHP-програми під час INSERT (додавання). Сувора база даних з включеним A_I сама вирішить і присвоїть: “Ти будеш 43-м, а ти 44-м…”.

Приклад структури:

Ім’я / Стовпець Тип A_I (Auto Inc) Додатково
id INT ☑️ YES Робимо його PRIMARY KEY (Головним індексом)
username VARCHAR(100) - Звичне ім’я
email VARCHAR(255) - Пошта UNIQUE (можна зробити індекс Унікальності щоб не було клонів реєстрацій по пошті)
password VARCHAR(255) - Довжина 255 обов’язкова для майбутніх довгих “хешів” пароля (Bcrypt), у жодному разі не 30 і тим паче не 16.

Висновки

  1. Збереження і структурування постійних масштабних даних найкраще виконувати в спеціалізованих програмах СКБД (Реляційних Базах Даних, на кшталт MySQL). Їм не страшні втрати пам’яті сервера, вони вкрай швидкі в пошуку і справляються з тисячною одночасною конкуренцією звернень, недоступними для файлових .txt.
  2. База містить масив таблиць, таблиці поділені на стовпці (назви та типи даних) і заповнюються цілими наборами нових “Рядків” (Записів).
  3. phpMyAdmin – це написана на веб-технологіях графічна адмін-панель для полегшення рутинних операцій з MySQL без знання консольних команд (візуальне “поклікування” кнопочок створення таблиць).
  4. Абсолютно кожна реляційна таблиця повинна мати обов’язковий стовпець id з типом INT, властивістю Первинного Ключа (Primary Key) та інкриментом на 1 кожного разу (Auto Increment - AI).
  5. Вибір правильного формату (DataType: Integer для цифр, Varchar(Length) для коротких ліній, і Text для блогів) економить оперативну пам’ять сервера в 10 разів і прискорює пошук.

Джерела

  1. Базова теорія РБД: https://uk.wikipedia.org/wiki/Реляційнабазаданих
  2. Що таке phpMyAdmin? Огляд від хостингу: https://www.hostinger.com/tutorials/what-is-phpmyadmin

Запитання для самоперевірки

  1. Згадайте проблему зберігання інформації в умовно складному файлі DB.txt. Назвіть щонайменше дві критичні переваги спеціалізованого Сервера Баз Даних (MySQL чи PostgreSQL) над підходом текстових файлів, особливо в умовах навантаженого Інтернет-Магазину.
  2. Прокоментуйте ієрархію логічної архітектури СКБД. Що таке “Колонка (Стовпець / Column)” порівняно з “Рядком (Записом / Row)”? Що з них є “описом схеми та правил”, а що є “безпосередньо фактичними даними”?
  3. Навіщо програмісту, створюючи таблицю products, обирати формат VARCHAR(100) для колонки “Назви”, якщо можна просто обрати TEXT і більше ніколи не думати й не перейматися про ліміти введеної розрядності символів? На які ресурси впливає цей вимушений ліміт довжини?
  4. Що означає галочка “A_I” (Auto Increment) навпроти стовпця з типом даних Integer при проєктуванні таблиці? Яку проблему логіки розробника Backend-коду вона делегує системі серверу MySQL?
  5. Чому наявність “Primary Key” (Первинного ключа) є життєво необхідною, якщо в системі можуть бути створені 2 записи (Рядки) з абсолютно однаковим логіном та однаковим паролем і аватаркою (повні “Справжні Клони”)? Як ви зробите запит для знищення тільки одного їх?