Хранение данных в реляционных БД (SQL)
Содержание
Введение в системы управления базами данных
Что такое СУБД?
Система управления базами данных (СУБД или DBMS - Database Management System) — это комплекс программного обеспечения, который управляет базами данных и обеспечивает взаимодействие с ними. База данных хранит данные, а СУБД управляет этими данными и предоставляет инструменты для работы с ними.
Зачем нужны базы данных?
Базы данных нужны для:
- Структурированного хранения данных
- Быстрого доступа к данным
- Обеспечения целостности данных
- Многопользовательского доступа
- Надежности и восстановления данных
Альтернативы базам данных:
- Хранение в файлах (JSON, CSV) - минусы: необходимость загружать все данные в память, проблемы с синхронизацией при одновременном доступе, сложность поиска и фильтрации
- Самописные файловые системы - минусы: необходимость создания своей системы индексации, сложность обеспечения целостности данных, отсутствие встроенных механизмов резервного копирования
Типы баз данных
Реляционные базы данных (SQL) основаны на концепции отношений (relation) между таблицами. Обеспечивают гарантии целостности данных при правильной настройке.
Популярные реляционные СУБД:
- PostgreSQL
- MySQL/MariaDB
- SQLite
- Microsoft SQL Server
- Oracle
Нереляционные базы данных (NoSQL) имеют различные подходы к хранению данных:
- Документ-ориентированные (MongoDB) — хранят JSON-документы
- Key-value хранилища (Redis) — эффективные словари с быстрым доступом
- Графовые базы (Neo4j) — оптимизированы для хранения связей и графов
- Колоночные базы — оптимизированы для аналитических запросов
Почему именно PostgreSQL?
- Поддержка большого количества типов данных
- Расширяемость
- Поддержка сложных запросов
- Обеспечение целостности данных
- Открытый исходный код
- Активное сообщество разработчиков
- Стабильность и надежность
Установка и настройка PostgreSQL
Разворачивание PostgreSQL через Docker
Docker позволяет легко и быстро развернуть PostgreSQL без сложной настройки системы.
Пример файла docker-compose.yml:
version: '3'
services:
db:
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: example
POSTGRES_DB: blog
volumes:
- postgres_data:/var/lib/postgresql/data
adminer:
image: adminer
ports:
- "8080:8080"
pgadmin:
image: dpage/pgadmin4
ports:
- "5050:80"
environment:
PGADMIN_DEFAULT_EMAIL: Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.
PGADMIN_DEFAULT_PASSWORD: admin
volumes:
postgres_data:
Команды для запуска:
docker-compose up -d # Запуск в фоновом режиме
docker-compose ps # Проверка запущенных сервисов
Инструменты для работы с PostgreSQL
Существует несколько инструментов для работы с PostgreSQL:
- PyCharm Professional — встроенная поддержка баз данных
- pgAdmin — веб-интерфейс для управления PostgreSQL
- Adminer — легковесный веб-интерфейс для работы с базами данных
- DBeaver — бесплатный универсальный клиент для работы с базами данных
- Database Navigator — плагин для PyCharm Community Edition
Основы языка SQL
Создание таблиц
SQL (Structured Query Language) — язык структурированных запросов, предназначенный для управления данными в реляционных базах данных.
CREATE TABLE authors (
id SERIAL PRIMARY KEY,
username VARCHAR(255) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE
);
Вставка данных
INSERT INTO authors (username) VALUES ('admin');
INSERT INTO authors (username, email) VALUES
('kyle', Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. '),
('bob', Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. ');
Выборка данных
-- Выбрать все поля из таблицы
SELECT * FROM authors;
-- Выбрать конкретные поля
SELECT id, username FROM authors;
-- Выбрать с фильтрацией
SELECT username, email FROM authors
WHERE LENGTH(username) = 4 AND email IS NULL;
-- Сортировка результатов
SELECT * FROM authors ORDER BY id DESC;
Обновление и удаление данных
-- Обновление данных
UPDATE authors
SET email = CONCAT(username, Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. ')
WHERE LENGTH(username) = 4 AND email IS NULL;
-- Удаление данных
DELETE FROM authors WHERE username = 'admin';
Отношения между таблицами
Внешние ключи и целостность данных
Внешние ключи (foreign keys) обеспечивают ссылочную целостность между таблицами:
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
body TEXT DEFAULT '',
author_id INTEGER NOT NULL,
CONSTRAINT fk_author
FOREIGN KEY (author_id)
REFERENCES authors(id)
);
Это ограничение гарантирует, что в поле author_id можно вставить только те значения, которые существуют в таблице authors в колонке id.
JOIN операторы
JOIN операторы используются для объединения данных из разных таблиц.
INNER JOIN
Возвращает только те записи, для которых есть совпадения в обеих таблицах:
SELECT posts.*, authors.username
FROM posts
INNER JOIN authors ON posts.author_id = authors.id;
LEFT OUTER JOIN
Возвращает все записи из левой таблицы и совпадающие записи из правой. Если совпадений нет, поля из правой таблицы будут содержать NULL:
SELECT authors.username, posts.id, posts.title
FROM authors
LEFT OUTER JOIN posts ON authors.id = posts.author_id;
Продвинутые техники работы с данными
Пагинация данных
Использование LIMIT и OFFSET
-- Первые 2 записи
SELECT * FROM authors ORDER BY id LIMIT 2;
-- Следующие 2 записи
SELECT * FROM authors ORDER BY id LIMIT 2 OFFSET 2;
Эффективная пагинация через WHERE
-- После записи с id=3
SELECT * FROM authors WHERE id > 3 ORDER BY id LIMIT 2;
Фильтрация с использованием LIKE
-- Авторы с email на домене yaru.ru
SELECT * FROM authors WHERE email LIKE '%@yaru.ru';
-- Авторы с email не на домене yaru.ru или без email
SELECT * FROM authors WHERE email NOT LIKE '%@yaru.ru' OR email IS NULL;
Ограничения целостности данных
Внешние ключи обеспечивают целостность данных, например, невозможно удалить автора, если у него есть посты:
-- Эта команда завершится ошибкой, если у автора есть посты
DELETE FROM authors WHERE id = 3;
Для каскадного удаления можно использовать:
-- В определении таблицы
CONSTRAINT fk_author
FOREIGN KEY (author_id)
REFERENCES authors(id)
ON DELETE CASCADE;
Заключение
Реляционные базы данных и язык SQL являются фундаментальными инструментами для хранения и управления данными в современных приложениях. Понимание основных концепций, таких как создание таблиц, выполнение запросов, установление отношений между таблицами и обеспечение целостности данных, является критически важным для разработчиков.
PostgreSQL представляет собой мощную, надежную и гибкую систему управления базами данных с открытым исходным кодом, которая отлично подходит как для обучения, так и для использования в реальных проектах.
Дальнейшее изучение темы включает работу с индексами, оптимизацию запросов, транзакции, хранимые процедуры и использование ORM (Object-Relational Mapping) в приложениях.