← 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-команды:

Это главные действия для работы с данными.

Читать.

Создавать.

Изменять.

Удалять.

Круг жизни базы данных.

С точками с запятой.