Files
db/labs/lab1/report.typ
2025-10-12 22:06:59 +03:00

536 lines
21 KiB
Typst
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#set text(size: 1.3em)
#show link: underline
#set page(footer: context {
if counter(page).get().first() > 1 [
#align(center)[
#counter(page).display("1")
]
]
})
#show raw.where(block: false): box.with(
fill: luma(240),
inset: (x: 3pt, y: 0pt),
outset: (y: 3pt),
radius: 2pt,
)
#show raw.where(block: true): block.with(
fill: luma(240),
inset: 10pt,
radius: 4pt,
)
// title
#align(center)[Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики]
\
\
\
#align(center)[Факультет инфокоммуникационных технологий]
#align(center)[Направление подготовки 11.03.02]
\
\
#align(center)[Практическая работа №1]
//#align(center)[Установка и первоначальная настройка субд postgresql.]
\
\
\
\ //#align(center)[Вариант 19]
\
\
\
\
\
\
\
#align(right)[Выполнил:]
#align(right)[Дощенников Никита Андреевич]
#align(right)[Группа: К3221]
#align(right)[Проверила:]
#align(right)[Татьяна Евгеньевна Войтюк]
\
\
#align(center)[Санкт-Петербург]
#align(center)[2025]
#pagebreak()
=== Цель работы:
Освоить базовые приёмы установки и настройки субд "postgresql", научиться использовать pgadmin для администрирования, развернуть учебную базу данных "demo" и ознакомиться с её структурой, а также закрепить навыки создания баз данных и схем на примере учебной бд "hr".
Изучение принципов проектирования и администрирования реляционных баз данных в среде postgresql с использованием графического интерфейса pgadmin и языка sql. Освоение создания, изменения и связи таблиц, настройки ограничений целостности, индексов и построения ER-диаграмм. Формирование практических навыков работы с объектами базы данных, добавления и проверки данных, а также документирования структуры базы данных.
=== Задачи, решаемые при выполнении работы.
- Установить и настроить субд postgresql и клиент pgadmin.
- Проверить правильность работы сервера с помощью выполнения тестового запроса.
- Развернуть учебную базу demo и убедиться в доступности её объектов.
- Ознакомиться со структурой базы demo и проанализировать основные сущности.
- Создать учебную базу данных двумя способами: через графический интерфейс и с помощью `CREATE DATABASE`.
- Создать в базе данных hr схемы для группировки объектов.
- Освоить создание таблиц в базе данных с использованием графического интерфейса pgadmin и sql запросов.
- Научиться задавать ключевые параметры таблиц: первичные ключи, автоинкрементные поля, значения по умолчанию и ограничения `NOT NULL`.
- Изучить применение команды `ALTER TABLE` для изменения структуры таблицы без потери данных.
- Создать связи между таблицами (внешние ключи) как через интерфейс pgadmin, так и с помощью sql кода.
- Научиться создавать индексы для оптимизации поиска и сортировки данных.
- Освоить построение и редактирование er диаграмм для визуализации структуры базы данных.
- Научиться добавлять, изменять и проверять данные в таблицах с помощью интерфейса pgadmin и dml запросов.
- Изучить назначение и реализацию ограничений целостности.
- Научиться очищать таблицы с помощью команды `TRUNCATE` и выполнять внешние sql скрипты для заполнения и модификации базы.
- Сформировать целостное представление о создании и сопровождении базы данных на примере модели hr.
=== Исходные данные.
- Сервер с установленными docker и контейнерами:
- postgres:16 сервер субд postgresql,
- dpage/pgadmin4 веб-интерфейс для администрирования.
- Учебная база данных demo.
- субд postgresql и графическая оболочка pgadmin.
- бд hr, содержащая схемы и объекты для работы.
- схема employeesDepartments, созданная на предыдущем этапе.
- sql-скрипты, предоставленные в методических материалах:
- набор заданий, предполагающих создание таблиц employees, departments, locations и других таблиц базы данных hr.
- примерные структуры таблиц и параметры столбцов.
- методические указания по выполнению лабораторных работ и пошаговые инструкции с примерами sql команд и интерфейсных действий.
=== Выполнение работы.
==== Часть 1.
===== Задание 1. Установка необходимого ПО.
Для выполнения работы была установлена субд postgresql и приложение pgadmin. Установка производилась в среде docker.
На сервере был установлен docker и запущены контейнеры: `postgres:16`, `dpage/pgadmin4`.
#align(center)[#image("part1/assets/18.png")]
Контейнеры были объединены в общую сеть docker, чтобы pgadmin мог напрямую подключаться к postgres.
#align(center)[#image("part1/assets/19.png")]
pgadmin стал доступен по адресу #link("https://db.fymio.us")[db.fymio.us]
#align(center)[#image("part1/assets/20.png")]
В pgadmin был зарегистрирован новый сервер. В настройках подключения были указаны следующие параметры:
#align(center)[#image("part1/assets/16.png")]
#align(center)[#image("part1/assets/17.png")]
В "Object Explorer" слева я раскрыл узел "Databases":
#align(center)[#image("part1/assets/1.png")]
Затем я нажал ПКМ по базе "postgres" и выбрал инструмент "Querry Tool":
#align(center)[#image("part1/assets/2.png")]
В открывшемся окне написал запрос проверки версии сервера `SELECT version();`. После этого нажал кнопку "Execute script".
#align(center)[#image("part1/assets/3.png")]
В поле "Data Output" я увидел версию `PostgreSQL 16.10`.
===== Задание 2. Подключение учебной базы данных.
После выполнения следующих команд на сервере учебная база данных появилась в "Object Explorer".
```bash
wget https://edu.postgrespro.ru/demo-medium.zip
unzip demo-medium.zip
docker exec -i postgres psql -U postgres -d postgres < demo-medium-20170815.sql
```
После появления базы данных "demo", в "Querry Tool" я выполнил следующий скрипт:
```sql
SELECT * FROM bookings.aircrafts_data;
```
#align(center)[#image("part1/assets/4.png")]
===== Задание 3. Ознакомление с учебной БД.
Я ознакомился с описанием БД на сайте #link("https://postgrespro.ru/education/demodb")[postgrespro.ru/education/demodb]
===== Задание 4. Создание учебной базы данных HR средствами pgAdmin.
Я нажал ПКМ на узле "Databases" и выбрал меню "Create" затем "Database...".
#align(center)[#image("part1/assets/5.png")]
Затем в октрывшемся окне я выставил следующие настройки.
#align(center)[#image("part1/assets/6.png")]
#align(center)[#image("part1/assets/7.png")]
Затем я сохранил настройки. В "Object Explorer" появилась созданная база.
#align(center)[#image("part1/assets/8.png")]
После этого я удалил базу через ПКМ.
#align(center)[#image("part1/assets/9.png")]
===== Задание 5. Создание учебной базы данных HR средствами PL/pgSQL
Я открыл "Querry Tool" базы данных `postgres`. И прописал следующий скрипт.
```sql
CREATE DATABASE hr
WITH ENCODING 'UTF8'
LC_COLLATE 'C'
LC_CTYPE 'C'
TEMPLATE template0
CONNECTION LIMIT 1;
```
#align(center)[#image("part1/assets/10.png")]
После этого в списке баз появилась созданная.
#align(center)[#image("part1/assets/11.png")]
===== Задание 6. Создание схем.
Я развернул вкладку для создания схем.
#align(center)[#image("part1/assets/12.png")]
И создал схему "EmployeesDepartments". В "Object Explorer" видно что схема создана.
#align(center)[#image("part1/assets/13.png")]
Чтобы создать вторую схему, я открыл "Querry Tool" к базе `hr`. И прописал следующие запросы:
```cs
CREATE SCHEMA IF NOT EXISTS "countries"
AUTHORIZATION postgres;
```
#align(center)[#image("part1/assets/14.png")]
В "Object Explorer" видна добавленная схема:
#align(center)[#image("part1/assets/15.png")]
==== Часть 2.
===== Задание 1. Создание таблицы в графической среде pgadmin.
Я раскрыл базу hr до узла tables и выбрал опцию create:
#align(center)[#image("part2/assets/1.png")]
И создал таблицу `EMPLOYEES`:
#align(center)[#image("part2/assets/2.png")]
Затем я заполнил вкладку `columns` как показано на рисунке в условии:
#align(center)[#image("part2/assets/3.png")]
Для поля `employee_id`, я выставил следующие параметры:
#align(center)[#image("part2/assets/4.png")]
Для столбца `hire_date` я поставил значение по умолчанию `current_date`.
#align(center)[#image("part2/assets/5.png")]
После этого, я сохранил таблицу.
===== Задание 2. Создание таблицы в Query Editor.
Я открыл query tool для hr и вписал туда следующий скрипт:
```sql
CREATE TABLE "EmployeesDepartments"."DEPARTMENTS" (
DEPARTMENT_ID integer GENERATED ALWAYS AS IDENTITY (INCREMENT 1 START 1) PRIMARY KEY NOT NULL,
DEPARTMENT_NAME character varying(30)[] NOT NULL,
MANAGER_ID bigint NULL,
LOCATION_ID integer NULL
);
```
#align(center)[#image("part2/assets/6.png")]
Таблица появилась в object explorer:
#align(center)[#image("part2/assets/7.png")]
Затем я создал еще одну таблицу скриптом:
```sql
CREATE TABLE "EmployeesDepartments"."LOCATIONS"
(LOCATION_ID smallint GENERATED ALWAYS AS IDENTITY NOT NULL,
STREET_ADDRESS character varying(40),
POSTAL_CODE character varying(12),
CITY character varying(30),
COUNTRY_ID CHAR(2)
);
```
#align(center)[#image("part2/assets/9.png")]
Как можно видеть, таблица была создана:
#align(center)[#image("part2/assets/10.png")]
===== Задание 3. Изменение таблицы.
В querry tool я ввел следующее:
```
ALTER TABLE "EmployeesDepartments"."LOCATIONS"
ADD STATE_PROVINCE character varying(25) NULL;
```
#align(center)[#image("part2/assets/11.png")]
Изменил столбец CITY следующим кодом:
```
ALTER TABLE "EmployeesDepartments"."LOCATIONS"
ADD CONSTRAINT "PK_LokationId" PRIMARY KEY (LOCATION_ID);
```
#align(center)[#image("part2/assets/12.png")]
Таблица locations:
#align(center)[#image("part2/assets/13.png")]
Затем я прописал текст скрипта `script1_create.sql`:
#align(center)[#image("part2/assets/14.png")]
#align(center)[#image("part2/assets/15.png")]
===== Задание 4. Создание отношения графическим интерфейсом pgadmin.
Я нажал ПКМ по таблице EmployeesDepartments.LOCATIONS и выбрал меню создания внешнего ключа:
#align(center)[#image("part2/assets/16.png")]
Затем я ввел задание название отношения:
#align(center)[#image("part2/assets/17.png")]
После, я добавил столбец кнопкой add:
#align(center)[#image("part2/assets/18.png")]
Вкладка sql:
#align(center)[#image("part2/assets/19.png")]
Ограничения locations:
#align(center)[#image("part2/assets/20.png")]
Затем я создал отношение с помощью ddl оператора alter table:
```sql
ALTER TABLE "Countries"."COUNTRIES"
ADD CONSTRAINT "COUNTR_REG_ID_FK1" FOREIGN KEY ("REGION_ID")
REFERENCES "Countries"."REGIONS" ("REGION_ID");
```
#align(center)[#image("part2/assets/21.png")]
===== Задание 5. Создания индекса с помощью графического интерфейса pgadmin.
В таблице EmployeesDepartments.LOCATIONS, я выбрал раздел меню для создания индекса:
#align(center)[#image("part2/assets/22.png")]
Я в диалоге создания индекса я передал следующие параметры:
#align(center)[#image("part2/assets/23.png")]
#align(center)[#image("part2/assets/24.png")]
#align(center)[#image("part2/assets/25.png")]
sql:
#align(center)[#image("part2/assets/26.png")]
===== Задание 6. Построение диаграмм базы данных.
Для создания диаграммы я нажал ПКМ на узел базы данных и выбрал параметр "ERD For Database":
#align(center)[#image("part2/assets/27.png")]
Затем я скорректировал вид своей диаграммы в соответствии с условием:
#align(center)[#image("part2/assets/28.png")]
Я экспортировал снимок диаграммы, нажав на соответствующую кнопку. Результат:
#align(center)[#image("part2/assets/29.png")]
Сохранил проект диаграммы:
#align(center)[#image("part2/assets/30.png")]
===== Задание 7. Добавление данных в таблицу.
Я раскрыл меню для генерирования скрипта по вставке данных в таблицу Countries.CURRENCIES:
#align(center)[#image("part2/assets/31.png")]
Затем я добавил следующий код в скрипт:
```sql
INSERT INTO "Countries"."CURRENCIES"("COMMENTS", "CURRENCY_NAME", "CURRENCY_CODE")
VALUES('EuroZone', 'Euro', 'EUR');
```
#align(center)[#image("part2/assets/32.png")]
После запуска скрипта проверил при помощи:
```sql
select * from "Countries"."CURRENCIES";
```
#align(center)[#image("part2/assets/33.png")]
В столбце EMPLOYEE_ID я заменил identity с always на by default.
#align(center)[#image("part2/assets/34.png")]
Затем при помощи графического интерфейса pgadmin, я добавил запись в таблицу "EmployeesDepartments"."EMPLOYEES":
#align(center)[#image("part2/assets/35.png")]
#align(center)[#image("part2/assets/36.png")]
Затем я добавил строку и сохранил данные:
#align(center)[#image("part2/assets/37.png")]
#align(center)[#image("part2/assets/38.png")]
#align(center)[#image("part2/assets/39.png")]
Затем, в querry tool я ввел следующий код:
```sql
INSERT INTO "EmployeesDepartments"."EMPLOYEES"("FIRST_NAME", "LAST_NAME", "EMAIL", "PHONE_NUMBER", "JOB_ID", "SALARY", "COMMISSION_PCT", "MANAGER_ID", "DEPARTMENT_ID")
VALUES(2, 'Steven', 'King', 'SKING', '515.123.4567', 'AD_PRES', 24000, null, null, 90);
```
#align(center)[#image("part2/assets/40.png")]
Проверим:
```sql
SELECT * FROM "EmployeesDepartments"."EMPLOYEES";
```
#align(center)[#image("part2/assets/41.png")]
===== Задание 8. Ограничения для столбцов.
Я добавил ограничения к таблицам "Countries"."SPOKEN_LANGUAGES" и "EmployeesDepartments"."EMPLOYEES" при помощи следующего кода:
```sql
ALTER TABLE "Countries"."SPOKEN_LANGUAGES"
ADD CONSTRAINT "CTRY_NUM_FK1" FOREIGN KEY ("COUNTRY_ID")
REFERENCES "Countries"."COUNTRIES" ("COUNTRY_ID");
```
#align(center)[#image("part2/assets/42.png")]
#align(center)[#image("part2/assets/43.png")]
и
```sql
ALTER TABLE "EmployeesDepartments"."EMPLOYEES"
ADD CONSTRAINT "EMP_SALARY_MIN"
CHECK ("SALARY" > 0);
```
#align(center)[#image("part2/assets/44.png")]
#align(center)[#image("part2/assets/45.png")]
Затем я добавил еще одно ограничение для таблицы JOB_HISTORY. Для этого в свойствах таблицы в разделе constraints добавил check c условием, что "END_DATE" > "START_DATE":
#align(center)[#image("part2/assets/46.png")]
#align(center)[#image("part2/assets/47.png")]
Я включил это ограничение выключив соответствующую опцию:
#align(center)[#image("part2/assets/48.png")]
#align(center)[#image("part2/assets/49.png")]
Также я проверил работоспособность ограничения:
```sql
INSERT INTO "EmployeesDepartments"."JOB_HISTORY"
("EMPLOYEE_ID", "START_DATE", "END_DATE", "JOB_ID", "DEPARTMENT_ID")
VALUES(200, '06-17-1993', '09-17-1987', 'AD_ASST', 90);
```
#align(center)[#image("part2/assets/50.png")]
и
```sql
INSERT INTO "EmployeesDepartments"."JOB_HISTORY"
("EMPLOYEE_ID", "START_DATE", "END_DATE", "JOB_ID", "DEPARTMENT_ID")
VALUES(200, '06-17-1981', '06-17-1993', 'AD_ASST', 90);
```
#align(center)[#image("part2/assets/51.png")]
===== Задание 9. Очистка таблиц и завершение создания БД HR.
Я произвел очистку таблицы EMPLOYEES с помощью DDL команды `TRUNCATE`:
```sql
TRUNCATE "EmployeesDepartments"."EMPLOYEES";
```
#align(center)[#image("part2/assets/52.png")]
Также я очистил JOB_HISTORY и CURRENCIES:
```sql
TRUNCATE "EmployeesDepartments"."JOB_HISTORY";
```
#align(center)[#image("part2/assets/53.png")]
и
```sql
TRUNCATE "Countries"."CURRENCIES";
```
#align(center)[#image("part2/assets/54.png")]
После очистки я выполнил код из файла `script2_alter.sql`:
#align(center)[#image("part2/assets/55.png")]
И для добавления данных, я выполнил скрипт `script3_insert.sql`:
#align(center)[#image("part2/assets/56.png")]
Результат:
#align(center)[#image("part2/assets/57.png")]
=== Выводы.
В ходе работы я освоил установку и настройку postgresql и pgadmin в docker, подключил учебную базу данных и выполнил тестовые запросы. Были созданы базы и схемы разными способами, таблицы с ключами и ограничениями, добавлены данные и построена er-диаграмма. Возникшие ошибки с локалью и ключами устранены корректировкой параметров и последовательностью вставки данных. Работа позволила закрепить навыки проектирования и администрирования баз данных, настройки связей и проверки целостности.