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

С возвращением.
В предыдущем уроке ты установил 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.
Это главные действия для работы с данными.
Читать.
Создавать.
Изменять.
Удалять.
Круг жизни базы данных.
С точками с запятой.