Бази Даних і Таблиці

Вітаю знову.
У попередній лекції ти встановив PostgreSQL, відкрив psql, створив першу базу даних, першу таблицю, вставив дані й виконав перший SELECT.
Це вже справжня робота з базою даних.
Маленька.
Але справжня.
Сьогодні ми трохи сповільнимось і подивимось на дуже важливу тему:
Бази даних і таблиці.
Так.
Назви звучать просто.
Але саме тут народжується багато майбутніх проблем.
Погана структура таблиці — це як безлад у гаражі.
Спочатку все виглядає нормально.
Потім одного дня тобі потрібен один кабель.
І раптом ти борешся зі старим велосипедом, трьома коробками й загадковим стільцем, який ніхто не памʼятає, коли купив.
У PostgreSQL структура має значення.
Дуже велике.
Що Ти Вивчиш
У цій лекції ти вивчиш:
- що таке база даних;
- що таке таблиця;
- як працюють рядки й колонки;
- що таке записи;
- як думати про дизайн таблиць;
- як вибирати хороші назви таблиць;
- як вибирати хороші назви колонок;
- як створювати кілька таблиць;
- як перевіряти структуру таблиці;
- як безпечно видаляти таблиці;
- як уникати типових помилок у дизайні.
Наприкінці цієї лекції ти розумітимеш, як PostgreSQL організовує дані.
Не просто як писати команди.
Ти почнеш думати як database developer.
Трохи небезпечно.
Дуже корисно.
База Даних vs Таблиця
База даних — це контейнер.
Таблиця — це місце, де живуть справжні структуровані дані.
Приклад:
Database: learning_postgresql
Tables:
students
books
courses
База даних містить таблиці.
Таблиці містять рядки.
Рядки містять реальні дані.
Можна думати так:
База даних = будинок
Таблиця = кімната
Рядок = річ у кімнаті
Колонка = деталь про цю річ
Наприклад, у таблиці students:
id | name | age | email
---|--------|-----|-------------------
1 | Anna | 22 | anna@example.com
2 | Marco | 28 | marco@example.com
Таблиця — це students.
Кожен рядок — це один студент.
Кожна колонка описує щось про студента.
Проста ідея.
Дуже потужна.
І дуже легко зробити безлад, якщо не бути уважним.
Як кабелі за столом.
Рядки й Колонки
Таблиця має колонки й рядки.
Колонки визначають структуру.
Рядки містять дані.
Приклад:
таблиця products
id | name | price | available
---|----------|-------|----------
1 | Laptop | 900 | true
2 | Mouse | 25 | true
3 | Keyboard | 70 | false
Колонки:
id;name;price;available.
Рядки:
- рядок Laptop;
- рядок Mouse;
- рядок Keyboard.
Колонка каже, який тип інформації можна зберігати.
Рядок зберігає одну реальну річ.
Це важливо.
Не створюй нову колонку для кожного нового елемента.
Погана ідея:
student1 | student2 | student3
---------|----------|---------
Anna | Marco | Viktor
Краща ідея:
id | name
---|--------
1 | Anna
2 | Marco
3 | Viktor
Рядки — для записів.
Колонки — для властивостей.
Це правило рятує життя.
Життя баз даних.
Але все одно важливо.
Що Таке Запис?
Запис — це один рядок у таблиці.
У цій таблиці:
students
id | name | age
---|--------|----
1 | Anna | 22
2 | Marco | 28
Anna — це один запис.
Marco — інший запис.
Запис зазвичай представляє одну річ:
- одного користувача;
- один товар;
- одне замовлення;
- одну книгу;
- один курс;
- одне завдання.
Якщо таблиця називається books, один рядок має бути однією книгою.
Якщо таблиця називається users, один рядок має бути одним користувачем.
Якщо таблиця називається orders, один рядок має бути одним замовленням.
Звучить очевидно.
Але хаос у базах даних часто починається тоді, коли один рядок намагається представляти занадто багато речей.
Один рядок не повинен бути користувачем, замовленням, оплатою і чеком за піцу одночасно.
Навіть PostgreSQL має межі.
Емоційно.
Підключись до Бази Даних
Відкрий PostgreSQL:
sudo -iu postgres psql
Підключись до бази з першої лекції:
\c learning_postgresql
Якщо її немає, створи:
CREATE DATABASE learning_postgresql;
Потім підключись:
\c learning_postgresql
Тепер ти готовий.
Двері бази даних відкриті.
Будь ласка, не врізайся в меблі.
Покажи Таблиці
Щоб показати таблиці в поточній базі даних, виконай:
\dt
Ти можеш побачити:
students
Якщо створив таблицю в першій лекції.
Якщо не бачиш жодної таблиці — це нормально.
Порожня база даних.
Свіжий старт.
Як новий блокнот.
Красиво.
Трохи лячно.
Створи Таблицю Books
Створімо нову таблицю з назвою books.
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title VARCHAR(150) NOT NULL,
author VARCHAR(100),
year_published INTEGER
);
Ця таблиця має:
id;title;author;year_published.
Тепер покажи таблиці:
\dt
Ти маєш побачити:
books
students
Тепер у нас більше ніж одна таблиця.
База даних стає маленькою бібліотекою.
Дуже професійно.
Майже.
Перевір Структуру Таблиці
Щоб перевірити структуру таблиці books, виконай:
\d books
PostgreSQL покаже структуру таблиці.
Ти побачиш назви колонок, типи даних і обмеження.
Щось таке:
id | integer
title | character varying(150)
author | character varying(100)
year_published | integer
Це корисно, коли забуваєш, які колонки створив.
А ти забудеш.
Без сорому.
Бази даних памʼятають, бо люди не памʼятають.
Такий у нас договір.
Встав Книги
Тепер встав кілька книг:
INSERT INTO books (title, author, year_published)
VALUES ('Clean Code', 'Robert C. Martin', 2008);
INSERT INTO books (title, author, year_published)
VALUES ('The Pragmatic Programmer', 'Andrew Hunt', 1999);
INSERT INTO books (title, author, year_published)
VALUES ('Database Design for Mere Mortals', 'Michael J. Hernandez', 2013);
Тепер прочитай дані:
SELECT * FROM books;
Ти маєш побачити свої книги.
Таблиця більше не порожня.
У ній є дані.
Таблиця без рядків — це лише план.
Таблиця з рядками — це місце, де починається історія.
Дуже поетично.
Як для SQL.
Назви Таблиць
Хороші назви мають значення.
Назва таблиці має описувати, що вона зберігає.
Хороші назви таблиць:
students
books
products
orders
customers
courses
Погані назви таблиць:
data
stuff
things
my_table
table1
new_table_final_final_real
Не називай таблиці так, як аварійні файли на робочому столі.
PostgreSQL заслуговує на краще.
І ти теж.
Використовуй зрозумілі назви.
У цьому курсі ми зазвичай використовуватимемо назви таблиць у множині:
students
books
orders
products
Чому множина?
Бо таблиця зберігає багато записів.
Таблиця students зберігає багатьох студентів.
Просто.
Читабельно.
Не всі погоджуються щодо множини чи однини в назвах таблиць.
Це нормально.
Найважливіше — послідовність.
Вибери один стиль.
Використовуй його всюди.
Не створюй student, books, order_table і tbl_products в одній базі.
Це не дизайн.
Це суп.
Назви Колонок
Назви колонок також мають бути зрозумілими.
Хороші назви колонок:
id
title
author
email
created_at
year_published
price
is_active
Погані назви колонок:
x
value
data1
thing
info
abc
Назва колонки має відповідати на питання:
Що тут зберігається?
Приклад:
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
title VARCHAR(150) NOT NULL,
description TEXT,
price INTEGER
);
Це читабельно.
Можна зрозуміти, що таблиця зберігає.
Твій майбутній ти це оцінить.
Твій майбутній ти вже втомлений.
Допоможи йому.
Використовуй snake_case
У PostgreSQL часто використовують snake_case.
Добре:
year_published
created_at
first_name
last_name
is_active
Уникай пробілів:
year published
first name
Уникай mixed case:
yearPublished
FirstName
PostgreSQL може працювати з mixed-case назвами в лапках, але це швидко стає неприємним.
Неприємний приклад:
SELECT "FirstName" FROM users;
Ні, дякую.
Використовуй маленькі літери й snake_case.
База буде чистішою.
Запити будуть легшими.
Майбутній debugging матиме менше сліз.
Одна Таблиця, Одна Тема
Таблиця зазвичай має зберігати один тип речей.
Добре:
students
courses
teachers
Погано:
students_and_courses_and_teachers
Чому?
Бо різні речі мають різні дані.
Студент має:
- імʼя;
- email;
- вік.
Курс має:
- назву;
- опис;
- ціну.
Викладач має:
- імʼя;
- предмет;
- email.
Не змішуй усе в одну величезну таблицю.
Велика таблиця спочатку здається простою.
Потім стає монстром.
І не милим монстром.
Монстром електронної таблиці.
Страшно.
Створи Таблицю Courses
Тепер створи ще одну таблицю:
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
title VARCHAR(150) NOT NULL,
description TEXT,
price INTEGER
);
Встав кілька курсів:
INSERT INTO courses (title, description, price)
VALUES ('PostgreSQL Basics', 'Learn database fundamentals with PostgreSQL.', 49);
INSERT INTO courses (title, description, price)
VALUES ('JavaScript Basics', 'Learn JavaScript from the beginning.', 59);
INSERT INTO courses (title, description, price)
VALUES ('HTML and CSS', 'Build clean web pages with HTML and CSS.', 39);
Прочитай дані:
SELECT * FROM courses;
Тепер твоя база даних має щонайменше три можливі таблиці:
students
books
courses
Кожна таблиця має свою тему.
Добре.
Чисто.
База даних схвалює.
Напевно.
Типи Даних Мають Значення
Кожна колонка має тип даних.
Приклад:
title VARCHAR(150)
price INTEGER
description TEXT
Тип даних каже PostgreSQL, який тип значення може потрапити в колонку.
Наприклад:
price INTEGER
означає, що ціна має бути числом.
Це добре.
Бо бази даних повинні захищати структуру.
Якщо дозволити кожній колонці приймати будь-що, хаос прийде в сонцезахисних окулярах.
Типи даних ми вивчимо детальніше пізніше.
Поки запамʼятай:
Використовуй текстові колонки для тексту.
Використовуй числові колонки для чисел.
Використовуй boolean-колонки для true або false.
Використовуй дати для дат.
Не зберігай усе як текст.
Це базоданна версія того, щоб кинути всі інструменти в одну коробку й назвати це організацією.
NULL і NOT NULL
Колонка може дозволяти порожні значення.
У SQL порожнє або відсутнє значення називається NULL.
Приклад:
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150),
subject VARCHAR(100)
);
Тут:
name VARCHAR(100) NOT NULL
означає, що імʼя обовʼязкове.
Але:
email VARCHAR(150)
може бути порожнім.
Тому це працює:
INSERT INTO teachers (name, subject)
VALUES ('Laura', 'Databases');
Бо email не є обовʼязковим.
А це не працює:
INSERT INTO teachers (email, subject)
VALUES ('laura@example.com', 'Databases');
Чому?
Бо name обовʼязковий.
PostgreSQL охороняє правило.
Дуже суворо.
Дуже корисно.
Як сторожовий пес зі знанням SQL.
Створи Таблицю Teachers
Створи таблицю:
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150),
subject VARCHAR(100)
);
Встав дані:
INSERT INTO teachers (name, email, subject)
VALUES ('Laura', 'laura@example.com', 'Databases');
INSERT INTO teachers (name, subject)
VALUES ('Paolo', 'Web Development');
Тепер прочитай:
SELECT * FROM teachers;
Ти маєш побачити, що Paolo не має email.
Це відсутнє значення — NULL.
Воно дозволене, бо колонка email не має NOT NULL.
Це дизайн таблиці.
Ти вирішуєш, що є обовʼязковим.
PostgreSQL це контролює.
Ти архітектор.
PostgreSQL — серйозний будівельник.
Видали Таблицю
Іноді потрібно видалити таблицю.
Будь обережний.
Це видаляє таблицю і її дані.
Приклад:
DROP TABLE teachers;
PostgreSQL видалить таблицю.
Назавжди.
Без емоційного відновлення.
Для безпеки можна використати:
DROP TABLE IF EXISTS teachers;
Це означає:
Видали таблицю, якщо вона існує.
Якщо її немає, не показуй помилку.
Не видаляй таблиці випадково.
Це не гра.
Ну добре, це курс.
Але все одно.
Поважай DROP.
Він має силу.
Занадто багато сили для слова з чотирьох літер.
Створи Таблицю Знову
Якщо ти видалив teachers, можеш створити її знову:
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150),
subject VARCHAR(100)
);
Це корисно для практики.
Під час навчання нормально створювати й видаляти тестові таблиці.
Просто не роби цього на production.
Production-бази даних — це не дитячий майданчик.
Вони більше схожі на музеї з електрикою.
Торкайся обережно.
Типові Помилки Дизайну
Одна Велика Таблиця
Погана ідея:
users_orders_products_payments
Одна таблиця для всього.
Вона стає складною для читання, оновлення й розуміння.
Краще:
users
orders
products
payments
Окремі таблиці для окремих речей.
Чиста структура.
Менше плачу.
Погані Назви Колонок
Погано:
n
em
val
thing1
thing2
Краще:
name
email
price
created_at
Зрозумілі назви роблять SQL легшим.
Незрозумілі назви злять твого майбутнього себе.
А твій майбутній ти знає, де ти живеш.
Зберігання Списків в Одній Колонці
Погано:
student_name | courses
-------------|-------------------------------
Anna | PostgreSQL, JavaScript, HTML
Це виглядає легко.
Але потім це складно шукати, оновлювати й звʼязувати з іншими даними.
Кращий дизайн використовує окремі таблиці.
Звʼязки ми вивчимо пізніше.
Поки запамʼятай:
Якщо значення містить список, можливо, йому потрібна інша таблиця.
Бази даних шепочуть такі речі.
Слухай уважно.
Практика
Створи таблицю з назвою movies.
Вона має мати:
id;title;director;year_released;rating.
Приклад:
CREATE TABLE movies (
id SERIAL PRIMARY KEY,
title VARCHAR(150) NOT NULL,
director VARCHAR(100),
year_released INTEGER,
rating INTEGER
);
Встав три фільми:
INSERT INTO movies (title, director, year_released, rating)
VALUES ('Inception', 'Christopher Nolan', 2010, 9);
Прочитай усі фільми:
SELECT * FROM movies;
Потім перевір структуру таблиці:
\d movies
Потім покажи всі таблиці:
\dt
Це допоможе потренувати:
- створення таблиці;
- вибір колонок;
- вставлення рядків;
- читання рядків;
- перевірку структури.
Дуже практично.
Дуже SQL.
Мінічелендж
Створи маленьку структуру бази даних для навчальної платформи.
Потрібні три таблиці:
students
courses
teachers
Кожна таблиця має мати щонайменше три колонки.
Приклад:
students:
id
name
email
courses:
id
title
price
teachers:
id
name
subject
Створи таблиці.
Встав щонайменше два рядки в кожну таблицю.
Потім виконай:
SELECT * FROM students;
SELECT * FROM courses;
SELECT * FROM teachers;
Це все ще просто.
Але тепер ти думаєш структурою бази даних.
Не лише командами.
Саме це і є мета.
Підсумок
Сьогодні ти вивчив:
- база даних містить таблиці;
- таблиці містять рядки й колонки;
- рядок також називають записом;
- кожна таблиця має зберігати один тип речей;
- хороші назви таблиць зрозумілі й послідовні;
- хороші назви колонок описують дані;
snake_case— хороший стиль назв;- типи даних визначають, яке значення зберігає колонка;
NULLозначає відсутнє значення;NOT NULLробить колонку обовʼязковою;\dtпоказує таблиці;\d table_nameпоказує структуру таблиці;DROP TABLEвидаляє таблицю і її дані;- хороша структура захищає від майбутнього хаосу.
Ця лекція може виглядати простою.
Але вона надзвичайно важлива.
Поганий дизайн бази даних створює проблеми, які повільно відрощують зуби.
Хороший дизайн робить майбутні запити легшими, безпечнішими й чистішими.
PostgreSQL потужний.
Але він не врятує тебе від таблиці з назвою stuff.
Будь добрим до своєї бази даних.
Називай речі правильно.
Структуруй речі ясно.
Твій майбутній ти не надсилатиме тобі злі повідомлення.
Можливо.
Наступна Лекція
У наступній лекції ми вивчимо базові SQL-команди:
SELECT;INSERT;UPDATE;DELETE.
Це головні дії для роботи з даними.
Читати.
Створювати.
Змінювати.
Видаляти.
Коло життя бази даних.
З крапками з комою.