← Back to course

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

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

Вітаю знову.

У попередній лекції ти встановив 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

Колонки:

Рядки:

Колонка каже, який тип інформації можна зберігати.

Рядок зберігає одну реальну річ.

Це важливо.

Не створюй нову колонку для кожного нового елемента.

Погана ідея:

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
);

Ця таблиця має:

Тепер покажи таблиці:

\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

Чому?

Бо різні речі мають різні дані.

Студент має:

Курс має:

Викладач має:

Не змішуй усе в одну величезну таблицю.

Велика таблиця спочатку здається простою.

Потім стає монстром.

І не милим монстром.

Монстром електронної таблиці.

Страшно.

Створи Таблицю 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.

Вона має мати:

Приклад:

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;

Це все ще просто.

Але тепер ти думаєш структурою бази даних.

Не лише командами.

Саме це і є мета.

Підсумок

Сьогодні ти вивчив:

Ця лекція може виглядати простою.

Але вона надзвичайно важлива.

Поганий дизайн бази даних створює проблеми, які повільно відрощують зуби.

Хороший дизайн робить майбутні запити легшими, безпечнішими й чистішими.

PostgreSQL потужний.

Але він не врятує тебе від таблиці з назвою stuff.

Будь добрим до своєї бази даних.

Називай речі правильно.

Структуруй речі ясно.

Твій майбутній ти не надсилатиме тобі злі повідомлення.

Можливо.

Наступна Лекція

У наступній лекції ми вивчимо базові SQL-команди:

Це головні дії для роботи з даними.

Читати.

Створювати.

Змінювати.

Видаляти.

Коло життя бази даних.

З крапками з комою.