├── install.md
├── labs
├── JOINs CTE etc.md
├── lab1.md
├── lab2.md
└── lab3.md
├── postgresql-docker.md
├── project
└── architecture.md
└── readme.md
/install.md:
--------------------------------------------------------------------------------
1 | # Установка софта
2 |
3 | ## Содержание
4 | 1. [Установка необходимого ПО](#установка-необходимого-по)
5 | - [PostgreSQL](#установка-postgresql)
6 | - [pgAdmin](#pgadmin)
7 | - [DataGrip](#datagrip)
8 | - [DBeaver](#dbeaver)
9 | 2. [Установка Docker](#установка-docker)
10 | - [Windows](#windows)
11 | - [Linux](#linux)
12 | - [macOS](#macos)
13 | 3. [Настройка PostgreSQL в Docker](#настройка-postgresql-в-docker)
14 | - [Запуск PostgreSQL через Docker](#запуск-postgresql-в-docker)
15 | - [Запуск через Docker Compose](#docker-compose)
16 | 4. [Подключение к PostgreSQL](#подключение-к-postgresql)
17 | - [DataGrip](#подключение-к-postgresql-через-datagrip)
18 | - [DBeaver](#подключение-к-postgresql-через-dbeaver)
19 |
20 | ---
21 |
22 | ## 1. Установка необходимого ПО
23 |
24 | ### Установка PostgreSQL
25 |
26 | #### Windows
27 | 1. Перейдите на [официальный сайт PostgreSQL](https://www.postgresql.org/download/windows/) и скачайте инсталлятор для Windows.
28 | 2. Запустите установку и выберите компоненты: PostgreSQL, pgAdmin, psql (CLI).
29 | 3. Следуйте инструкциям установщика.
30 |
31 | #### Linux
32 | На примере Ubuntu:
33 | 1. Обновите пакеты:
34 | ```bash
35 | sudo apt update
36 | ```
37 | 2. Установите PostgreSQL:
38 | ```bash
39 | sudo apt install postgresql postgresql-contrib
40 | ```
41 | 3. Проверьте статус PostgreSQL:
42 | ```bash
43 | sudo systemctl status postgresql
44 | ```
45 |
46 | #### macOS
47 | 1. Установите Homebrew, если не установлен:
48 | ```bash
49 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
50 | ```
51 | 2. Установите PostgreSQL:
52 | ```bash
53 | brew install postgresql
54 | ```
55 | 3. Запустите сервис:
56 | ```bash
57 | brew services start postgresql
58 | ```
59 |
60 | ### pgAdmin
61 | **pgAdmin** — графический интерфейс для работы с PostgreSQL.
62 |
63 | - **Windows**: Устанавливается вместе с PostgreSQL.
64 | - **Linux**: Установка на Ubuntu:
65 | ```bash
66 | sudo apt install pgadmin4
67 | ```
68 | - **macOS**: Установка через Homebrew:
69 | ```bash
70 | brew install --cask pgadmin4
71 | ```
72 |
73 | ### DataGrip
74 | - Скачайте DataGrip с [официального сайта JetBrains](https://www.jetbrains.com/datagrip/).
75 | - Поддерживает работу с PostgreSQL, автодополнение, визуализацию схем.
76 |
77 | ### DBeaver
78 | - Скачайте DBeaver с [официального сайта](https://dbeaver.io/download/).
79 | - Поддерживает PostgreSQL, бесплатен и кроссплатформен.
80 |
81 | ---
82 |
83 | ## 2. Установка Docker
84 |
85 | ### Windows
86 | 1. Скачайте **Docker Desktop** с [официального сайта](https://www.docker.com/products/docker-desktop).
87 | 2. Установите, следуя инструкциям.
88 | 3. Перезагрузите компьютер и запустите Docker Desktop.
89 |
90 | ### Linux
91 |
92 | #### Ubuntu:
93 | 1. Установите зависимости:
94 | ```bash
95 | sudo apt update
96 | sudo apt install apt-transport-https ca-certificates curl software-properties-common
97 | ```
98 | 2. Добавьте ключ репозитория Docker и установите репозиторий:
99 | ```bash
100 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
101 | sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
102 | ```
103 | 3. Установите Docker:
104 | ```bash
105 | sudo apt update
106 | sudo apt install docker-ce
107 | ```
108 | 4. Убедитесь, что Docker запущен:
109 | ```bash
110 | sudo systemctl start docker
111 | sudo systemctl enable docker
112 | ```
113 |
114 | 5. Добавьте текущего пользователя в группу Docker (чтобы не использовать `sudo`):
115 | ```bash
116 | sudo usermod -aG docker ${USER}
117 | ```
118 | Перезагрузите систему, чтобы изменения вступили в силу.
119 |
120 | 6. Проверьте установку:
121 | ```bash
122 | docker --version
123 | ```
124 |
125 | #### Fedora:
126 | 1. Установите Docker:
127 | ```bash
128 | sudo dnf install docker
129 | ```
130 | 2. Запустите сервис Docker:
131 | ```bash
132 | sudo systemctl start docker
133 | sudo systemctl enable docker
134 | ```
135 |
136 | ### macOS
137 | 1. Скачайте **Docker Desktop** с [официального сайта](https://www.docker.com/products/docker-desktop).
138 | 2. Установите и запустите Docker Desktop.
139 |
140 | ---
141 |
142 | ## 3. Настройка PostgreSQL в Docker
143 |
144 | ### Запуск PostgreSQL в Docker
145 | 1. Для запуска контейнера PostgreSQL используйте команду:
146 | ```bash
147 | docker run --name my-postgres -p 5432:5432 -e POSTGRES_USER=myuser -e POSTGRES_PASSWORD=mypassword -e POSTGRES_DB=mydb -d postgres:latest
148 | ```
149 | **Пояснение:**
150 | - `--name my-postgres`: имя контейнера.
151 | - `-p 5432:5432`: маппинг портов.
152 | - `-e POSTGRES_USER=myuser`: пользователь PostgreSQL.
153 | - `-e POSTGRES_PASSWORD=mypassword`: пароль.
154 | - `-e POSTGRES_DB=mydb`: база данных.
155 | - `-d postgres:latest`: запуск в фоне с последней версией PostgreSQL.
156 |
157 | 2. Проверьте, что контейнер запущен:
158 | ```bash
159 | docker ps
160 | ```
161 |
162 | 3. Для подключения к контейнеру используйте:
163 | ```bash
164 | docker exec -it my-postgres psql -U myuser -d mydb
165 | ```
166 |
167 | ### Docker Compose
168 | 1. Создайте файл `docker-compose.yml` с содержимым:
169 |
170 | ```yaml
171 | version: "3.9"
172 | services:
173 | postgres:
174 | image: postgres:latest
175 | environment:
176 | POSTGRES_DB: "mydb"
177 | POSTGRES_USER: "myuser"
178 | POSTGRES_PASSWORD: "mypassword"
179 | ports:
180 | - "5432:5432"
181 | volumes:
182 | - ./pgdata:/var/lib/postgresql/data
183 | ```
184 |
185 | 2. Запустите PostgreSQL с помощью Docker Compose:
186 | ```bash
187 | docker-compose up -d
188 | ```
189 |
190 | 3. Остановите контейнер:
191 | ```bash
192 | docker-compose down
193 | ```
194 |
195 | ---
196 |
197 | ## 4. Подключение к PostgreSQL
198 |
199 | ### Подключение к PostgreSQL через DataGrip
200 | 1. Откройте DataGrip: **File** → **New** → **Data Source** → **PostgreSQL**.
201 | 2. Введите следующие данные:
202 | - **Host**: `localhost`
203 | - **Port**: `5432`
204 | - **Database**: `mydb`
205 | - **User**: `myuser`
206 | - **Password**: `mypassword`
207 | 3. Нажмите **Test Connection** для проверки соединения.
208 |
209 | ### Подключение к PostgreSQL через DBeaver
210 | 1. Запустите DBeaver и выберите **Database** → **New Database Connection**.
211 | 2. Выберите **PostgreSQL** из списка.
212 | 3. Введите следующие параметры:
213 | - **Host**: `localhost`
214 | - **Port**: `5432`
215 | - **Database**: `mydb`
216 | - **Username**: `myuser`
217 | - **Password**: `mypassword`
218 | 4. Нажмите **Test Connection** для проверки соединения.
219 | 5. Если соединение успешно, нажмите **Finish**.
220 |
--------------------------------------------------------------------------------
/labs/JOINs CTE etc.md:
--------------------------------------------------------------------------------
1 | ### Лекция по PostgreSQL: Сложные запросы, подзапросы, JOIN, CTE и оптимизация
2 |
3 | #### Введение
4 |
5 | Сегодняшняя тема — сложные SQL-запросы в PostgreSQL. Мы рассмотрим такие важные аспекты, как подзапросы, объединения таблиц (JOIN), общие табличные выражения (CTE) и способы оптимизации запросов. Особое внимание будет уделено тонкостям использования этих инструментов, их влиянию на производительность и практическим рекомендациям по написанию высокоэффективных запросов. В конце лекции мы также разберем использование `EXPLAIN ANALYZE` для анализа и оптимизации запросов.
6 |
7 | ---
8 |
9 | ### 1. Подзапросы (Subqueries)
10 |
11 | #### Теория
12 |
13 | **Подзапрос** — это запрос, который выполняется внутри другого запроса и возвращает результат, используемый в основном запросе. Подзапросы могут быть скалярными (возвращают одно значение), или множественными (возвращают набор данных). PostgreSQL поддерживает вложенные подзапросы практически в любом месте SQL-запроса: в `SELECT`, `FROM`, `WHERE`, `JOIN` и других частях.
14 |
15 | Подзапросы особенно полезны, когда данные из одного запроса должны быть использованы в качестве фильтра или аргумента для другого запроса.
16 |
17 | #### Виды подзапросов
18 |
19 | 1. **Скалярные подзапросы**: возвращают одно значение.
20 | Пример: вычисление количества заказов для каждого клиента.
21 |
22 | ```sql
23 | SELECT first_name, last_name,
24 | (SELECT COUNT(*) FROM orders WHERE customers.id = orders.customer_id) AS order_count
25 | FROM customers;
26 | ```
27 |
28 | Здесь подзапрос возвращает количество заказов для каждого клиента.
29 |
30 | 2. **Множественные подзапросы**: возвращают несколько строк.
31 | Пример: выборка клиентов, которые сделали заказы на сумму более 1000.
32 |
33 | ```sql
34 | SELECT first_name, last_name
35 | FROM customers
36 | WHERE id IN (SELECT customer_id FROM orders WHERE amount > 1000);
37 | ```
38 |
39 | В данном примере подзапрос возвращает список `customer_id` из таблицы `orders`, которые затем используются для фильтрации в основном запросе.
40 |
41 | 3. **Подзапросы в секции `FROM` (Derived Tables)**: временные таблицы, созданные подзапросом, используются в основном запросе.
42 | Пример: получение статистики по заказам.
43 |
44 | ```sql
45 | SELECT *
46 | FROM (SELECT customer_id, COUNT(*) AS order_count FROM orders GROUP BY customer_id) AS order_stats
47 | WHERE order_count > 10;
48 | ```
49 |
50 | В этом примере подзапрос создает временную таблицу с результатами агрегирования по количеству заказов на каждого клиента.
51 |
52 | #### Практические тонкости и советы
53 |
54 | 1. **Когда использовать подзапросы:**
55 | - Используйте подзапросы, когда вычисления или фильтрации невозможно или неудобно сделать на одном уровне запроса.
56 | - Хороший пример — когда вам нужно выполнить промежуточные вычисления для дальнейшей фильтрации или группировки.
57 |
58 | 2. **Избегайте избыточных подзапросов:** Если подзапрос повторяется несколько раз, это может привести к его многократному выполнению, что замедлит работу. Рассмотрите использование `JOIN` или CTE для избежания повторяющихся подзапросов.
59 |
60 | 3. **Скалярные подзапросы в `SELECT`:** могут замедлять выполнение запросов, если они зависят от больших таблиц. В таких случаях лучше использовать `JOIN` для получения тех же данных, но более эффективно.
61 |
62 | 4. **Подзапросы в `WHERE`:** когда вы используете подзапросы в `WHERE` для фильтрации, убедитесь, что данные подзапроса могут быть эффективно получены с помощью индексов. В противном случае может выполняться полный скан таблицы (Seq Scan).
63 |
64 | #### Антипаттерны
65 |
66 | 1. **Использование подзапросов вместо `JOIN`:** Когда возможно, лучше использовать `JOIN` для объединения данных из нескольких таблиц, а не подзапросы в `WHERE`. Это снизит количество выполнений подзапроса.
67 |
68 | 2. **Избегайте коррелированных подзапросов:** Это подзапросы, которые выполняются для каждой строки основного запроса. Они могут быть очень медленными при больших объемах данных.
69 | Пример коррелированного подзапроса:
70 |
71 | ```sql
72 | SELECT customer_id, (SELECT SUM(amount) FROM orders WHERE orders.customer_id = customers.id) AS total_amount
73 | FROM customers;
74 | ```
75 |
76 | В этом примере подзапрос выполняется для каждой строки основной таблицы.
77 |
78 | #### Оптимизация
79 |
80 | - Рассмотрите возможность использования индексов для столбцов, участвующих в подзапросах, чтобы улучшить производительность.
81 | - Подумайте о преобразовании сложных подзапросов в `JOIN` или использование CTE для повышения читаемости и производительности.
82 |
83 | ---
84 |
85 | ### 2. JOIN
86 |
87 | #### Теория
88 |
89 | **JOIN** — это операция объединения данных из двух или более таблиц на основе условия. В PostgreSQL поддерживаются различные типы `JOIN`, что позволяет решать разнообразные задачи, такие как фильтрация данных, агрегация и работа с разнородными данными.
90 |
91 | #### Виды `JOIN`
92 |
93 | 1. **INNER JOIN**: Возвращает только те строки, которые соответствуют условию соединения.
94 |
95 | Пример:
96 |
97 | ```sql
98 | SELECT customers.first_name, customers.last_name, orders.order_id
99 | FROM customers
100 | INNER JOIN orders ON customers.id = orders.customer_id;
101 | ```
102 |
103 | 2. **LEFT JOIN**: Возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если совпадений нет, возвращаются `NULL`.
104 |
105 | Пример:
106 |
107 | ```sql
108 | SELECT customers.first_name, orders.order_id
109 | FROM customers
110 | LEFT JOIN orders ON customers.id = orders.customer_id;
111 | ```
112 |
113 | 3. **RIGHT JOIN**: Аналогично `LEFT JOIN`, но возвращает все строки из правой таблицы.
114 |
115 | Пример:
116 |
117 | ```sql
118 | SELECT orders.order_id, customers.first_name
119 | FROM orders
120 | RIGHT JOIN customers ON orders.customer_id = customers.id;
121 | ```
122 |
123 | 4. **FULL OUTER JOIN**: Возвращает все строки, которые есть хотя бы в одной из таблиц. Если нет совпадений, возвращаются `NULL`.
124 |
125 | Пример:
126 |
127 | ```sql
128 | SELECT customers.first_name, orders.order_id
129 | FROM customers
130 | FULL OUTER JOIN orders ON customers.id = orders.customer_id;
131 | ```
132 |
133 | 5. **CROSS JOIN**: Выполняет декартово произведение, т.е. соединяет каждую строку из первой таблицы с каждой строкой из второй.
134 |
135 | Пример:
136 |
137 | ```sql
138 | SELECT customers.first_name, orders.order_id
139 | FROM customers
140 | CROSS JOIN orders;
141 | ```
142 |
143 | #### Практические тонкости и советы
144 |
145 | 1. **Используйте правильный тип JOIN для вашей задачи:**
146 | - `INNER JOIN` полезен, когда вам нужны только совпадающие строки.
147 | - `LEFT JOIN` полезен, когда вам нужны все строки из левой таблицы, даже если нет совпадений в правой таблице.
148 |
149 | 2. **Оптимизация с использованием индексов:**
150 | - Убедитесь, что столбцы, по которым выполняется соединение, индексированы. Это может значительно ускорить выполнение запроса.
151 | - Пример создания индекса для улучшения производительности `JOIN`:
152 | ```sql
153 | CREATE INDEX idx_customer_id ON orders(customer_id);
154 | ```
155 |
156 | 3. **Избегайте использования `JOIN` с большим количеством таблиц:** При большом количестве соединений может возникнуть проблема производительности, так как каждый `JOIN` увеличивает объем данных для обработки.
157 |
158 | #### Антипаттерны
159 |
160 | 1. **Избыточное использование `LEFT JOIN`:** Если результат запроса вам требуется только при наличии совпадений в обеих таблицах, не используйте `LEFT JOIN` — это приведет к неоправданным затратам ресурсов.
161 |
162 | 2. **Избегайте `CROSS JOIN`, если это не специально задумано:** `CROSS JOIN` создает полное декартово произведение таблиц, что может привести к огромному количеству строк и замедлить выполнение запроса.
163 |
164 | 3. **Неиспользование индексов:** Если столбцы, участвующие в соединении, не индексированы, то выполнение запроса будет замедлено из-за необходимости последовательного сканирования таблиц.
165 |
166 | #### Оптимизация
167 |
168 | - Используйте индексы на столбцах, участвующих в `JOIN`.
169 | - В случае сложных запросов рассмотрите возможность использования CTE для упрощения логики.
170 | - Проверяйте планы выполнения запросов с помощью `EXPLAIN ANALYZE`, чтобы убедиться, что запросы выполняются оптимально.
171 |
172 | ---
173 |
174 | ### 3. Общие табличные выражения (CTE)
175 |
176 | #### Теория
177 |
178 | **Общие табличные выражения (CTE)** — это временные именованные результаты, определяемые в запросах с помощью ключевого слова `WITH`. CTE позволяют разбивать сложные запросы на части, делая их более понятными и поддерживаемыми. В отличие
179 |
180 | от подзапросов в `FROM`, CTE могут ссылаться друг на друга и, что особенно важно, могут быть рекурсивными.
181 |
182 | #### Пример CTE
183 |
184 | ```sql
185 | WITH order_totals AS (
186 | SELECT customer_id, SUM(amount) AS total_amount
187 | FROM orders
188 | GROUP BY customer_id
189 | )
190 | SELECT customers.first_name, order_totals.total_amount
191 | FROM customers
192 | JOIN order_totals ON customers.id = order_totals.customer_id
193 | WHERE order_totals.total_amount > 500;
194 | ```
195 |
196 | #### Рекурсивный CTE
197 |
198 | Рекурсивные CTE особенно полезны при работе с иерархическими данными, такими как структура подчиненности в компаниях.
199 |
200 | Пример:
201 |
202 | ```sql
203 | WITH RECURSIVE subordinates AS (
204 | SELECT employee_id, manager_id, full_name
205 | FROM employees
206 | WHERE manager_id IS NULL
207 | UNION ALL
208 | SELECT e.employee_id, e.manager_id, e.full_name
209 | FROM employees e
210 | JOIN subordinates s ON s.employee_id = e.manager_id
211 | )
212 | SELECT * FROM subordinates;
213 | ```
214 |
215 | #### Практические тонкости и советы
216 |
217 | 1. **Использование CTE для разбиения сложных запросов:** CTE позволяют разделить сложные запросы на более простые шаги. Это улучшает читаемость и поддержку запросов.
218 |
219 | 2. **Рекурсивные CTE:** могут быть полезны для обработки иерархических данных, таких как структура сотрудников или папок.
220 |
221 | 3. **Ограничение итераций в рекурсивных CTE:** Будьте осторожны при использовании рекурсивных CTE, так как они могут бесконечно зациклиться. Всегда добавляйте ограничение на количество итераций.
222 |
223 | #### Антипаттерны
224 |
225 | 1. **Избыточное использование CTE:** В некоторых случаях использование CTE может замедлять выполнение запроса, так как CTE выполняются как временные таблицы. Если CTE используется несколько раз в одном запросе, это может привести к его многократному выполнению.
226 |
227 | 2. **Рекурсия без ограничений:** Рекурсивные CTE могут стать причиной больших накладных расходов, если не ограничить количество итераций.
228 |
229 | ---
230 |
231 | ### 4. Оптимизация запросов с помощью EXPLAIN ANALYZE
232 |
233 | #### Теория
234 |
235 | `EXPLAIN` — это команда, которая показывает, как PostgreSQL планирует выполнить запрос. Она помогает выявить, какие шаги выполняются, какие индексы используются и как обрабатываются данные.
236 |
237 | `EXPLAIN ANALYZE` выполняет запрос и выводит реальный план выполнения с метриками времени.
238 |
239 | #### Пример использования EXPLAIN
240 |
241 | ```sql
242 | EXPLAIN SELECT * FROM customers WHERE id = 1;
243 | ```
244 |
245 | #### Пример использования EXPLAIN ANALYZE
246 |
247 | ```sql
248 | EXPLAIN ANALYZE SELECT * FROM customers WHERE id = 1;
249 | ```
250 |
251 | ---
252 |
253 | #### Заключение
254 |
255 | Сложные запросы требуют внимания к деталям, особенно когда речь идет о производительности. Подзапросы, `JOIN`, CTE и другие инструменты PostgreSQL должны использоваться с умом, чтобы избежать узких мест и перегрузки базы данных. Оптимизация с помощью инструментов, таких как `EXPLAIN ANALYZE`, позволяет точно определить, где запрос можно улучшить, что делает PostgreSQL мощным инструментом для анализа и обработки данных.
256 |
257 | ### Задача 1. Суммарная стоимость заказов для каждого клиента
258 |
259 | **Задача:** Для каждого клиента вывести общее количество заказов и суммарную стоимость всех заказов.
260 |
261 | #### Решение с использованием `JOIN`:
262 |
263 | ```sql
264 | SELECT c.id, c.first_name, c.last_name, COUNT(o.id) AS order_count, SUM(o.total_amount) AS total_spent
265 | FROM customers c
266 | LEFT JOIN orders o ON c.id = o.customer_id
267 | GROUP BY c.id, c.first_name, c.last_name;
268 | ```
269 |
270 | #### Решение с использованием подзапросов:
271 |
272 | ```sql
273 | SELECT c.id, c.first_name, c.last_name,
274 | (SELECT COUNT(*) FROM orders WHERE orders.customer_id = c.id) AS order_count,
275 | (SELECT SUM(total_amount) FROM orders WHERE orders.customer_id = c.id) AS total_spent
276 | FROM customers c;
277 | ```
278 |
279 | **Вывод и наилучшее решение:**
280 |
281 | Использование **`JOIN`** более предпочтительно в данном случае:
282 |
283 | - **Преимущества**:
284 | - **Производительность**: В этом решении выполняется одно объединение с таблицей `orders`, и данные агрегируются сразу. При подзапросах же каждый раз выполняется отдельный запрос для подсчета заказов и суммарной стоимости для каждого клиента, что накладывает дополнительную нагрузку на базу данных.
285 | - **Читаемость**: Запрос с `JOIN` проще понять, так как агрегации видны сразу и логика более линейна.
286 |
287 | - **Недостатки подзапросов**:
288 | - **Повторное выполнение**: Один и тот же подзапрос (к таблице `orders`) выполняется дважды, что снижает производительность.
289 | - **Проблемы с масштабируемостью**: В больших базах данных подзапросы могут значительно замедлять выполнение запросов из-за повторной выборки данных для каждого клиента.
290 |
291 | ---
292 |
293 | ### Задача 2. Список товаров, которые были заказаны более 10 раз
294 |
295 | **Задача:** Найти все товары, которые были заказаны более 10 раз.
296 |
297 | #### Решение с использованием подзапроса:
298 |
299 | ```sql
300 | SELECT p.id, p.name
301 | FROM products p
302 | WHERE (SELECT SUM(oi.quantity) FROM order_items oi WHERE oi.product_id = p.id) > 10;
303 | ```
304 |
305 | #### Решение с использованием `JOIN` и группировки:
306 |
307 | ```sql
308 | SELECT p.id, p.name, SUM(oi.quantity) AS total_quantity
309 | FROM products p
310 | JOIN order_items oi ON p.id = oi.product_id
311 | GROUP BY p.id, p.name
312 | HAVING SUM(oi.quantity) > 10;
313 | ```
314 |
315 | **Вывод и наилучшее решение:**
316 |
317 | Использование **`JOIN` и группировки** является оптимальным решением:
318 |
319 | - **Преимущества**:
320 | - **Производительность**: `JOIN` с последующей группировкой по продуктам позволяет один раз собрать данные и сразу агрегировать их по каждому продукту, в то время как подзапрос для каждого товара выполняется отдельно.
321 | - **Читаемость**: Запрос с использованием группировки лучше отражает бизнес-логику задачи — суммирование количества по каждому продукту. В случае подзапроса логика разбивается на части, что затрудняет понимание запроса.
322 |
323 | - **Недостатки подзапросов**:
324 | - **Плохая производительность**: Подзапрос для каждого товара создает значительную нагрузку на базу данных, особенно при большом количестве записей.
325 | - **Повторение логики**: Подзапрос сложно масштабировать или расширить для дополнительных условий, например, если нужно учитывать еще и временной диапазон.
326 |
327 | ---
328 |
329 | ### Задача 3. Найти категории товаров, чья суммарная стоимость заказов превышает $5000
330 |
331 | **Задача:** Найти категории товаров, общая стоимость заказанных товаров которых превышает $5000.
332 |
333 | #### Решение с использованием CTE:
334 |
335 | ```sql
336 | WITH category_totals AS (
337 | SELECT pc.category_id, SUM(oi.quantity * oi.price) AS total_sales
338 | FROM order_items oi
339 | JOIN products p ON oi.product_id = p.id
340 | JOIN product_categories pc ON p.id = pc.product_id
341 | GROUP BY pc.category_id
342 | )
343 | SELECT c.id, c.name, ct.total_sales
344 | FROM categories c
345 | JOIN category_totals ct ON c.id = ct.category_id
346 | WHERE ct.total_sales > 5000;
347 | ```
348 |
349 | #### Решение с использованием подзапроса:
350 |
351 | ```sql
352 | SELECT c.id, c.name,
353 | (SELECT SUM(oi.quantity * oi.price)
354 | FROM order_items oi
355 | JOIN products p ON oi.product_id = p.id
356 | JOIN product_categories pc ON p.id = pc.product_id
357 | WHERE pc.category_id = c.id) AS total_sales
358 | FROM categories c
359 | WHERE (SELECT SUM(oi.quantity * oi.price)
360 | FROM order_items oi
361 | JOIN products p ON oi.product_id = p.id
362 | JOIN product_categories pc ON p.id = pc.product_id
363 | WHERE pc.category_id = c.id) > 5000;
364 | ```
365 |
366 | **Вывод и наилучшее решение:**
367 |
368 | Использование **CTE** является более предпочтительным:
369 |
370 | - **Преимущества**:
371 | - **Производительность**: CTE сначала рассчитывает суммы для всех категорий в одном запросе, а затем можно выбирать или фильтровать данные по этим результатам. Это особенно полезно при сложных или больших наборах данных, где подзапросы могут многократно пересчитываться.
372 | - **Читаемость и поддержка**: CTE позволяет отделить логику подсчета суммы продаж от основного запроса. Это упрощает читаемость и позволяет легко модифицировать или расширить запрос.
373 |
374 | - **Недостатки подзапросов**:
375 | - **Медленная работа**: Подзапросы выполняются для каждой категории, что приводит к значительной задержке при большом количестве данных.
376 | - **Сложность в управлении**: Подзапросы более сложно поддерживать и изменять, особенно если требуется внести дополнительные условия или изменения.
377 |
378 | ---
379 |
380 | ### Задача 4. Иерархия подчиненности клиентов (реферальная структура)
381 |
382 | **Задача:** Построить иерархию клиентов, показывая всех клиентов, приглашенных одним человеком и их подчиненных.
383 |
384 | #### Решение с использованием рекурсивного CTE:
385 |
386 | ```sql
387 | WITH RECURSIVE referral_tree AS (
388 | SELECT id, first_name, last_name, NULL::INT AS referrer_id, 0 AS level
389 | FROM customers
390 | WHERE referrer_id IS NULL -- корневые клиенты
391 | UNION ALL
392 | SELECT c.id, c.first_name, c.last_name, c.referrer_id, rt.level + 1
393 | FROM customers c
394 | JOIN referral_tree rt ON c.referrer_id = rt.id
395 | )
396 | SELECT * FROM referral_tree;
397 | ```
398 |
399 | **Вывод и наилучшее решение:**
400 |
401 | Использование **рекурсивного CTE** — единственное подходящее решение:
402 |
403 | - **Преимущества**:
404 | - **Естественное представление иерархий**: Рекурсивный CTE идеально подходит для работы с иерархическими данными, такими как реферальные структуры, и позволяет легко строить сложные древовидные структуры.
405 | - **Читаемость и поддержка**: CTE позволяет писать запросы, которые логически разделены на рекурсивные шаги. Это делает код более понятным, особенно при анализе иерархий.
406 |
407 | - **Недостатков** почти нет, однако:
408 | - **Проблемы с производительностью**: При слишком глубокой или большой иерархии рекурсивные запросы могут стать медленными. Чтобы избежать бесконечной рекурсии, рекомендуется использовать ограничение на глубину иерархии.
409 |
410 | ---
411 |
412 | ### Задача 5. Найти самых активных клиентов, сделавших заказы за последние 30 дней
413 |
414 | **Задача:** Найти клиентов, которые сделали наибольшее количество заказов за последние 30 дней.
415 |
416 | #### Решение с использованием `JOIN` и подзапроса:
417 |
418 | ```sql
419 | SELECT c.id, c.first_name, c.last_name, order_count
420 | FROM customers c
421 | JOIN (
422 | SELECT customer_id, COUNT(*) AS order_count
423 | FROM orders
424 | WHERE order_date > NOW() - INTERVAL '30 days'
425 | GROUP BY customer_id
426 | ORDER BY order_count DESC
427 | LIMIT 10
428 | ) AS top_customers ON c.id = top_customers.customer_id;
429 | ```
430 |
431 | #### Решение с использованием CTE:
432 |
433 | ```sql
434 | WITH recent_orders AS (
435 | SELECT customer_id, COUNT(*) AS order_count
436 | FROM orders
437 | WHERE order_date > NOW() - INTERVAL '30 days'
438 | GROUP BY customer_id
439 | )
440 | SELECT c.id, c.first_name, c.last_name, ro.order_count
441 | FROM customers c
442 | JOIN recent_orders ro ON c.id = ro.customer_id
443 | ORDER BY ro.order_count DESC
444 | LIMIT 10;
445 | ```
446 |
447 | **Вывод и наилучшее решение:**
448 |
449 | Оба решения **похожи по эффективности**, но использование CTE предпочтительнее:
450 |
451 | - **Преимущества CTE**:
452 | - **Читаемость**: Запрос с CTE проще понять и поддерживать, так как CTE выделяет отдельный логический шаг — подсчет заказов за последние 30 дней.
453 | -
454 |
455 | **Расширяемость**: Если потребуется усложнение логики, например, добавление дополнительных условий к подсчету заказов, CTE позволяет легко это сделать, не перегружая основной запрос.
456 |
457 | - **Недостатки подзапроса**:
458 | - **Сложность изменения**: Подзапросы более громоздкие и сложные для изменений или добавления новых условий.
459 |
460 | ### Сравнительная таблица по подзапросам, JOIN и CTE (включая рекурсивные)
461 |
462 | | Инструмент | Определение | Советы по использованию | Тонкости использования | Примеры задач, где лучше использовать |
463 | |-------------------|-------------|-------------------------|------------------------|---------------------------------------|
464 | | **Подзапросы** | Подзапрос — это вложенный запрос, который выполняется отдельно и передает результат в основной запрос. Подзапрос может возвращать одно или несколько значений. | - Используйте подзапросы, если требуется вычисление, которое нельзя просто включить в основной запрос.
- Подзапросы подходят для фильтрации или вычисления значений, которые используются в других частях запроса.
- Подходят, когда нужно изолировать логику. | - Может сильно замедлить запрос, так как каждый подзапрос выполняется независимо для каждой строки.
- Можно использовать в `SELECT`, `FROM`, и `WHERE` частях запроса.
- Подзапросы бывают зависимыми и независимыми: зависимые подзапросы зависят от внешнего запроса и выполняются многократно, что может быть неэффективно.
- Читаемость запроса усложняется, если в нем много вложенных подзапросов. | - Найти клиентов, которые совершили заказ больше 5 раз, используя подзапрос в `WHERE`.
- Найти товары, которых было продано более 10 штук, с подзапросом в `SELECT` для подсчета общего количества заказанных единиц. |
465 | | **JOIN** | `JOIN` объединяет строки из двух или более таблиц на основе связанного между ними поля (например, по первичному и внешнему ключу). Это позволяет работать с несколькими таблицами в одном запросе. | - Используйте `JOIN` для работы с несколькими таблицами одновременно.
- Подходит для агрегации данных и соединения данных по схожим полям.
- Рекомендуется использовать индексы на полях, по которым производится `JOIN`, чтобы избежать проблем с производительностью.
- Оптимальный вариант для выборок и агрегирования данных из нескольких таблиц. | - `INNER JOIN` выбирает только те строки, которые имеют совпадения в обеих таблицах.
- `LEFT JOIN` позволяет сохранить все строки из левой таблицы, даже если нет совпадений в правой таблице.
- Большие таблицы без индексов на полях для `JOIN` могут значительно замедлить запрос.
- При работе с большим числом таблиц могут возникнуть сложности с пониманием структуры запроса. | - Вывести список клиентов и их заказов.
- Найти сумму продаж товаров в каждой категории.
- Определить, сколько товаров каждой категории продано за последний месяц, используя `JOIN` между таблицами продуктов, категорий и заказов. |
466 | | **CTE** | CTE (Common Table Expression) — это временный набор данных, который определен в начале запроса с помощью `WITH`. Используется для разделения сложных запросов на более простые части. | - Используйте CTE, если нужно улучшить читаемость сложных запросов.
- Подходит для разделения сложных логических шагов.
- Можно использовать несколько CTE в одном запросе, что улучшает модульность.
- Подходит для случаев, когда нужно многократно использовать одни и те же данные в разных частях запроса. | - CTE — это временная таблица, которая существует только в рамках одного запроса.
- Выполняется один раз за запрос, даже если используется несколько раз (в отличие от подзапросов, которые могут выполняться многократно).
- Упрощает управление сложной логикой запросов, улучшая читаемость.
- Может быть менее производительным, если запросы требуют высокой частоты обновлений данных (из-за временной природы CTE). | - Построение списка товаров и категорий с общей суммой заказов для каждой категории.
- Поиск суммарных продаж за последний месяц для каждого клиента с делением логики на несколько шагов.
- Подходит, когда в запросе требуется использование одной и той же логики в разных частях, например, для подсчета суммы заказов и общего количества заказов одновременно. |
467 | | **Рекурсивный CTE**| Рекурсивный CTE — это CTE, который сам вызывает себя до тех пор, пока не выполнится определенное условие остановки. Обычно используется для работы с иерархическими данными. | - Используйте рекурсивные CTE для работы с иерархиями или деревьями (например, структура реферальных клиентов, иерархия категорий).
- Подходит для задач, где необходима рекурсивная обработка данных (например, вычисление пути в графе). | - Рекурсивные CTE используют два выражения: начальное и рекурсивное, которое выполняется до тех пор, пока не выполнится условие остановки.
- Рекомендуется ограничить глубину рекурсии для предотвращения бесконечных циклов.
- На больших объемах данных может быть медленным, особенно при работе с глубокими иерархиями. | - Построение структуры подчиненных клиентов в реферальной программе.
- Вычисление иерархии категорий товаров и их подкатегорий.
- Поиск кратчайшего пути в графе (например, в логистических задачах). |
468 |
469 | ### Подробные объяснения:
470 |
471 | #### **Подзапросы:**
472 | Подзапросы — это инструмент для изоляции логики внутри более крупного запроса. Они особенно полезны, когда требуется предварительно вычислить определенные значения или условия для основной выборки данных. Например, подзапросы могут использоваться в `SELECT` для добавления вычисляемых полей, в `WHERE` для фильтрации или даже в `FROM` для создания временной таблицы.
473 |
474 | - **Плюсы:**
475 | - Легко изолировать сложные логики.
476 | - Позволяют использовать результаты вычислений в других частях запроса.
477 |
478 | - **Минусы:**
479 | - Низкая производительность при повторном выполнении подзапросов.
480 | - Усложнение запроса при большой вложенности.
481 |
482 | #### **JOIN:**
483 | `JOIN` позволяет объединять таблицы по связанным полям. Это основной инструмент для работы с реляционными базами данных, так как именно в этом и заключается их суть — связывать различные сущности.
484 |
485 | - **Плюсы:**
486 | - Высокая производительность при наличии индексов.
487 | - Четкая структура данных с возможностью группировки и фильтрации.
488 |
489 | - **Минусы:**
490 | - Без индексов `JOIN` может значительно замедлить работу.
491 | - Усложненные запросы при большом количестве таблиц.
492 |
493 | #### **CTE (Common Table Expression):**
494 | CTE позволяет улучшить читаемость и структурировать сложные запросы. Они не влияют на производительность напрямую, но делают код более модульным и понятным.
495 |
496 | - **Плюсы:**
497 | - Легкость понимания и поддержки сложных запросов.
498 | - Выполняется один раз за запрос, что улучшает производительность по сравнению с подзапросами.
499 |
500 | - **Минусы:**
501 | - Может быть менее производительным при работе с очень большими данными или частыми обновлениями.
502 |
503 | #### **Рекурсивный CTE:**
504 | Рекурсивный CTE используется для решения задач, требующих рекурсивной обработки данных, таких как иерархии или графы. Это мощный инструмент, когда требуется вычисление на нескольких уровнях иерархии, например, в задачах с реферальными структурами или древовидными данными.
505 |
506 | - **Плюсы:**
507 | - Эффективен для работы с иерархическими данными.
508 | - Удобен для рекурсивных вычислений.
509 |
510 | - **Минусы:**
511 | - Потенциально медленная работа с глубокими иерархиями.
512 | - Риск бесконечных циклов без ограничения глубины рекурсии.
513 |
514 | ### Вывод:
515 | Каждый из этих инструментов имеет свое назначение и должен применяться в зависимости от задачи:
516 |
517 | - **Подзапросы** хороши для простых изолированных логик, но следует избегать их при работе с большими объемами данных.
518 | - **JOIN** является стандартным инструментом для объединения таблиц, особенно полезен при агрегации данных.
519 | - **CTE** отлично подходит для сложных многошаговых запросов, улучшая их читаемость и поддержку.
520 | - **Рекурсивный CTE** — лучший выбор для работы с иерархиями и рекурсивными структурами данных.
521 |
--------------------------------------------------------------------------------
/labs/lab1.md:
--------------------------------------------------------------------------------
1 | ### Лабораторная работа: Проектирование модели данных
2 |
3 | **Описание работы:**
4 | В данной лабораторной работе студенты будут заниматься проектированием моделей данных для различных предметных областей. Каждая предметная область предполагает решение типичных задач управления информацией, таких как учет клиентов, товаров, заказов и взаимодействий между ними. Студенты должны определить сущности, взаимосвязи между ними и создать модель данных, которая может быть использована в базе данных для хранения и обработки информации. Основная цель работы — научиться проектировать корректные структуры данных с учетом требований предметной области.
5 |
6 | **Цель лабораторной работы:**
7 | - Научиться анализировать предметную область и выделять ключевые сущности.
8 | - Научиться проектировать взаимосвязи между сущностями.
9 | - Научиться создавать ER-диаграммы для визуализации структуры данных.
10 |
11 | **Что нужно сделать:**
12 | 1. Для каждой предложенной предметной области, выберите ключевые сущности, которые будут представлены в модели данных.
13 | 2. Определите, какие связи существуют между сущностями (1:1, 1:N, M:N).
14 | 3. Постройте ER-диаграмму, которая наглядно покажет структуру данных и взаимосвязи между сущностями. Для этого используйте нотацию PlantUML. В диаграмме должны быть указаны все основные атрибуты сущностей и связи между ними.
15 |
16 | **Результат работы:**
17 | После выполнения задания у вас должна быть готовая модель данных, описанная с помощью ER-диаграммы, которая может быть использована для реализации базы данных.
18 |
19 | **Дедлайны выполнения лабораторной работы уточняйте у своего семинариста**
20 |
21 | ### Основные термины
22 |
23 | 1. **Модель данных**
24 | Модель данных — это абстрактное представление структуры данных и их взаимосвязей в информационной системе. Она определяет, как данные будут храниться, организовываться и манипулироваться в базе данных.
25 |
26 | 2. **Сущность (Entity)**
27 | Сущность — это объект или концепция, которая имеет значение в контексте предметной области и которую нужно хранить в базе данных. Например, в системе учета студентов сущностями могут быть «Студент», «Курс», «Преподаватель».
28 |
29 | 3. **Атрибут (Attribute)**
30 | Атрибут — это характеристика или свойство сущности. Например, для сущности «Студент» атрибутами могут быть «Имя», «Фамилия», «Дата рождения».
31 |
32 | 4. **Связь (Relationship)**
33 | Связь — это ассоциация между двумя или несколькими сущностями. Она описывает, как сущности взаимодействуют друг с другом. Например, связь может быть «Записан на» между сущностями «Студент» и «Курс».
34 |
35 | 5. **Тип связи (Relationship Type)**
36 | Тип связи определяет, сколько экземпляров одной сущности может быть связано с экземплярами другой сущности. Основные типы связей:
37 | - **1:1 (Один к одному)** — каждый экземпляр одной сущности связан с одним экземпляром другой сущности.
38 | - **1:N (Один ко многим)** — один экземпляр одной сущности связан с несколькими экземплярами другой сущности.
39 | - **M:N (Многие ко многим)** — несколько экземпляров одной сущности связаны с несколькими экземплярами другой сущности.
40 |
41 | 6. **ER-диаграмма (Entity-Relationship Diagram)**
42 | ER-диаграмма — это графическое представление модели данных. Она показывает сущности, их атрибуты и связи между ними, а также типы связей и ограничения. ER-диаграммы используются для проектирования и анализа баз данных.
43 |
44 | 7. **PlantUML**
45 | PlantUML — это инструмент для создания диаграмм и графиков, в том числе ER-диаграмм, с помощью текстового описания. Он позволяет визуализировать модели данных в удобном и понятном виде. Вы можете использовать [PlantUML Editor](https://plantuml-editor.kkeisuke.com/) для создания и редактирования диаграмм.
46 |
47 | ---
48 |
49 | ### Вариант 1: Управление библиотекой
50 |
51 | **Задача 1: Определение модели данных для управления библиотекой**
52 | Смоделируйте систему для управления библиотечным фондом. Необходимо учитывать книги, авторов и читателей. Система должна поддерживать хранение данных о том, какие книги есть в библиотеке, кто их написал и кто их берет на прочтение.
53 |
54 | **Задача 2: Определение связей между сущностями**
55 | Определите связи между книгами, авторами и читателями. Каждая книга может быть написана одним или несколькими авторами. Каждый читатель может брать несколько книг. Определите типы связей между этими сущностями.
56 |
57 | **Задача 3: Построение ER-диаграммы**
58 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Необходимо описать сущности для книг, авторов и читателей и указать связи между ними.
59 |
60 | ---
61 |
62 | ### Вариант 2: Интернет-магазин
63 |
64 | **Задача 1: Определение модели данных для интернет-магазина**
65 | Создайте модель данных для интернет-магазина, который управляет товарами, покупателями и заказами. В системе должна храниться информация о том, какие товары предлагаются к продаже, кто покупатели и какие заказы они делают.
66 |
67 | **Задача 2: Определение связей между сущностями**
68 | Определите связи между сущностями товара, покупателя и заказа. Один заказ может включать несколько товаров. Один покупатель может сделать несколько заказов. Определите типы этих связей.
69 |
70 | **Задача 3: Построение ER-диаграммы**
71 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Необходимо описать сущности для товаров, покупателей и заказов и указать связи между ними.
72 |
73 | ---
74 |
75 | ### Вариант 3: Автопрокат
76 |
77 | **Задача 1: Определение модели данных для автопроката**
78 | Создайте модель данных для системы управления автопрокатом. В системе должны учитываться автомобили, клиенты и аренды. Необходимо учитывать, какие автомобили доступны, кто их арендует и на какой срок.
79 |
80 | **Задача 2: Определение связей между сущностями**
81 | Определите связи между автомобилями, клиентами и арендными договорами. Один клиент может арендовать несколько автомобилей, а один автомобиль может быть арендован несколькими клиентами в разное время. Определите типы этих связей.
82 |
83 | **Задача 3: Построение ER-диаграммы**
84 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для автомобилей, клиентов и аренд и укажите связи между ними.
85 |
86 | ---
87 |
88 | ### Вариант 4: Управление университетом
89 |
90 | **Задача 1: Определение модели данных для расписания занятий в университете**
91 | Создайте модель данных для управления расписанием занятий в университете. В системе должны учитываться курсы, преподаватели и студенты.
92 |
93 | **Задача 2: Определение связей между сущностями**
94 | Определите связи между курсами, преподавателями и студентами. Один курс может быть преподаваем несколькими преподавателями. Один студент может быть записан на несколько курсов. Определите типы связей между этими сущностями.
95 |
96 | **Задача 3: Построение ER-диаграммы**
97 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Необходимо описать сущности для курсов, преподавателей и студентов и указать связи между ними.
98 |
99 | ---
100 |
101 | ### Вариант 5: Ресторан
102 |
103 | **Задача 1: Определение модели данных для управления заказами в ресторане**
104 | Создайте модель данных для системы управления заказами в ресторане. В системе должны учитываться блюда, официанты и клиенты.
105 |
106 | **Задача 2: Определение связей между сущностями**
107 | Определите связи между блюдами, заказами и клиентами. Один заказ может включать несколько блюд, а один клиент может сделать несколько заказов. Определите типы связей между этими сущностями.
108 |
109 | **Задача 3: Построение ER-диаграммы**
110 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Описать сущности для блюд, заказов и клиентов и указать связи между ними.
111 |
112 | ---
113 |
114 | ### Вариант 6: Больница
115 |
116 | **Задача 1: Определение модели данных для управления пациентами и медицинскими записями**
117 | Создайте модель данных для управления медицинскими записями пациентов в больнице. В системе должны учитываться пациенты, врачи и медицинские записи.
118 |
119 | **Задача 2: Определение связей между сущностями**
120 | Определите связи между пациентами, врачами и медицинскими записями. Один пациент может наблюдаться у нескольких врачей, а один врач может вести несколько пациентов. Определите типы этих связей.
121 |
122 | **Задача 3: Построение ER-диаграммы**
123 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Описать сущности для пациентов, врачей и медицинских записей и указать связи между ними.
124 |
125 | ---
126 |
127 | ### Вариант 7: Туристическое агентство
128 |
129 | **Задача 1: Определение модели данных для управления турами и бронированиями**
130 | Создайте модель данных для управления турами, клиентами и бронированиями. Система должна хранить информацию о турах, клиентах и их заказах.
131 |
132 | **Задача 2: Определение связей между сущностями**
133 | Определите связи между турами, клиентами и бронированиями. Один тур может быть забронирован несколькими клиентами, а один клиент может забронировать несколько туров.
134 |
135 | **Задача 3: Построение ER-диаграммы**
136 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для туров, клиентов и бронирований и связи между ними.
137 |
138 | ---
139 |
140 | ### Вариант 8: Фитнес-клуб
141 |
142 | **Задача 1: Определение модели данных для управления клиентами и занятиями**
143 | Создайте модель данных для учета клиентов и занятий в фитнес-клубе. В системе должны храниться клиенты, тренеры и расписание занятий.
144 |
145 | **Задача 2: Определение связей между сущностями**
146 | Определите связи между клиентами, тренерами и занятиями. Один тренер может вести несколько занятий, а один клиент может посещать несколько занятий.
147 |
148 | **Задача 3: Построение ER-диаграммы**
149 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для клиентов, тренеров и занятий и укажите связи между ними.
150 |
151 | ---
152 |
153 | ### Вариант 9: Кинотеатр
154 |
155 | **Задача 1: Определение модели данных для управления показами и бронированиями**
156 | Создайте модель данных для управления показами фильмов и бронированием билетов в кинотеатре. В системе должны храниться фильмы, сеансы и бронирования.
157 |
158 | **Задача 2: Определение связей между сущностями**
159 | Определите связи между фильмами, сеансами и бронированиями. Один фильм может показываться на нескольких сеансах, а одно бронирование может быть связано с одним сеансом.
160 |
161 | **Задача 3: Построение ER-диаграммы**
162 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для фильмов, сеансов и бронирований и связи между ними.
163 |
164 | ---
165 |
166 | ### Вариант 10: Аптека
167 |
168 | **Задача 1: Определение модели данных для управления лекарственными средствами и заказами**
169 | Создайте модель данных для управления лекарствами, клиентами и заказами в аптеке. Система должна хранить информацию о доступных лекарствах и заказах клиентов.
170 |
171 | **Задача 2: Определение связей между сущностями**
172 | Определите связи между лекарствами, клиентами и заказами. Один клиент может сделать несколько заказов, каждый заказ может содержать несколько лекарств.
173 |
174 | **Задача 3: Построение ER-диаграммы**
175 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для лекарств, клиентов и заказов и укажите связи между ними.
176 |
177 | ---
178 |
179 | ### Вариант 11: Спортивный клуб
180 |
181 | **Задача 1: Определение модели данных для управления спортивными мероприятиями**
182 | Создайте модель данных для управления спортивными мероприятиями и участниками в спортивном клубе. Система должна хранить информацию о соревнованиях, участниках и результатах.
183 |
184 | **Задача 2: Определение связей между сущностями**
185 | Определите связи между мероприятиями, участниками и результатами. Одно мероприятие может включать несколько участников, каждый участник может участвовать в нескольких мероприятиях.
186 |
187 | **Задача 3: Построение ER-диаграммы**
188 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для мероприятий, участников и результатов и укажите связи между ними.
189 |
190 | ---
191 |
192 | ### Вариант 12: Музыкальная школа
193 |
194 | **Задача 1: Определение модели данных для управления курсами и студентами**
195 | Создайте модель данных для управления курсами, преподавателями и студентами в музыкальной школе. Система должна хранить информацию о курсах, студентах и преподавателях.
196 |
197 | **Задача 2: Определение связей между сущностями**
198 | Определите связи между курсами, студентами и преподавателями. Один курс может быть преподаваем несколькими преподавателями, один студент может записаться на несколько курсов.
199 |
200 | **Задача 3: Построение ER-диаграммы**
201 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для курсов, преподавателей и студентов и укажите связи между ними.
202 |
203 | ---
204 |
205 | ### Вариант 13: Клиника
206 |
207 | **Задача 1: Определение модели данных для управления пациентами и приемами**
208 | Создайте модель данных для управления пациентами, врачами и приемами в клинике. Система должна учитывать пациентов, врачей и медицинские приемы.
209 |
210 | **Задача 2: Определение связей между сущностями**
211 | Определите связи между пациентами, врачами и приемами. Один врач может вести приемы нескольких пациентов, один пациент может посещать нескольких врачей.
212 |
213 | **Задача 3: Построение ER-диаграммы**
214 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для пациентов, врачей и приемов и укажите связи между ними.
215 |
216 | ---
217 |
218 | ### Вариант 14: Строительная компания
219 |
220 | **Задача 1: Определение модели данных для управления проектами и сотрудниками**
221 | Создайте модель данных для управления строительными проектами, сотрудниками и заданиями. Система должна хранить информацию о проектах, задачах и сотрудниках.
222 |
223 | **Задача 2: Определение связей между сущностями**
224 | Определите связи между проектами, сотрудниками и задачами. Один проект может включать несколько задач, один сотрудник может быть назначен на несколько задач.
225 |
226 | **Задача 3: Построение ER-диаграммы**
227 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для проектов, задач и сотрудников и укажите связи между ними.
228 |
229 | ---
230 |
231 | ### Вариант 15: Химическая лаборатория
232 |
233 | **Задача 1: Определение модели данных для учета экспер
234 |
235 | иментов**
236 | Создайте модель данных для управления химическими экспериментами, учеными и результатами. Система должна хранить информацию о проведенных экспериментах и их результатах.
237 |
238 | **Задача 2: Определение связей между сущностями**
239 | Определите связи между учеными, экспериментами и результатами. Один ученый может участвовать в нескольких экспериментах, один эксперимент может иметь несколько результатов.
240 |
241 | **Задача 3: Построение ER-диаграммы**
242 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для экспериментов, ученых и результатов и укажите связи между ними.
243 |
244 | ---
245 |
246 | ### Вариант 16: Библиотека
247 |
248 | **Задача 1: Определение модели данных для учета книг и пользователей**
249 | Создайте модель данных для управления книгами, пользователями и записями об аренде книг в библиотеке. Система должна хранить информацию о книгах, читателях и истории аренды.
250 |
251 | **Задача 2: Определение связей между сущностями**
252 | Определите связи между книгами, пользователями и арендами. Один пользователь может арендовать несколько книг, а одна книга может быть арендована несколькими пользователями.
253 |
254 | **Задача 3: Построение ER-диаграммы**
255 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для книг, пользователей и аренды и укажите связи между ними.
256 |
257 | ---
258 |
259 | ### Вариант 17: Магазин одежды
260 |
261 | **Задача 1: Определение модели данных для управления заказами и клиентами**
262 | Создайте модель данных для управления ассортиментом товаров, клиентами и заказами в интернет-магазине одежды. Система должна учитывать товары, клиентов и их заказы.
263 |
264 | **Задача 2: Определение связей между сущностями**
265 | Определите связи между товарами, клиентами и заказами. Один клиент может разместить несколько заказов, один заказ может включать несколько товаров.
266 |
267 | **Задача 3: Построение ER-диаграммы**
268 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для товаров, клиентов и заказов и укажите связи между ними.
269 |
270 | ---
271 |
272 | ### Вариант 18: Автосервис
273 |
274 | **Задача 1: Определение модели данных для учета заказов на ремонт**
275 | Создайте модель данных для учета клиентов, автомобилей и заказов на ремонт в автосервисе. Система должна хранить информацию о клиентах, автомобилях и ремонтных заказах.
276 |
277 | **Задача 2: Определение связей между сущностями**
278 | Определите связи между клиентами, автомобилями и заказами. Один клиент может иметь несколько автомобилей, каждый автомобиль может быть задействован в нескольких заказах на ремонт.
279 |
280 | **Задача 3: Построение ER-диаграммы**
281 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для клиентов, автомобилей и заказов на ремонт и укажите связи между ними.
282 |
283 | ---
284 |
285 | ### Вариант 19: Кулинарная школа
286 |
287 | **Задача 1: Определение модели данных для управления курсами и студентами**
288 | Создайте модель данных для управления кулинарными курсами, преподавателями и студентами. Система должна учитывать курсы, преподавателей и студентов, зарегистрированных на курсы.
289 |
290 | **Задача 2: Определение связей между сущностями**
291 | Определите связи между курсами, преподавателями и студентами. Один курс может быть проведен несколькими преподавателями, один студент может записаться на несколько курсов.
292 |
293 | **Задача 3: Построение ER-диаграммы**
294 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для курсов, преподавателей и студентов и укажите связи между ними.
295 |
296 | ---
297 |
298 | ### Вариант 20: Ветеринарная клиника
299 |
300 | **Задача 1: Определение модели данных для управления животными и приемами**
301 | Создайте модель данных для учета клиентов, их домашних животных и приемов в ветеринарной клинике. Система должна хранить информацию о животных, их владельцах и приемах.
302 |
303 | **Задача 2: Определение связей между сущностями**
304 | Определите связи между клиентами, их животными и приемами. Один клиент может иметь несколько домашних животных, каждое животное может посещать несколько приемов.
305 |
306 | **Задача 3: Построение ER-диаграммы**
307 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для клиентов, животных и приемов и укажите связи между ними.
308 |
309 | ---
310 |
311 | ### Вариант 21: Ресторан
312 |
313 | **Задача 1: Определение модели данных для управления меню и заказами**
314 | Создайте модель данных для управления блюдами, заказами и клиентами ресторана. Система должна учитывать меню, клиентов и заказы.
315 |
316 | **Задача 2: Определение связей между сущностями**
317 | Определите связи между блюдами, заказами и клиентами. Один клиент может разместить несколько заказов, один заказ может содержать несколько блюд.
318 |
319 | **Задача 3: Построение ER-диаграммы**
320 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для блюд, клиентов и заказов и укажите связи между ними.
321 |
322 | ---
323 |
324 | ### Вариант 22: Страховая компания
325 |
326 | **Задача 1: Определение модели данных для управления страховыми полисами и клиентами**
327 | Создайте модель данных для учета клиентов, страховых полисов и страховых случаев в страховой компании. Система должна учитывать данные о клиентах, полисах и страховых выплатах.
328 |
329 | **Задача 2: Определение связей между сущностями**
330 | Определите связи между клиентами, полисами и страховыми случаями. Один клиент может иметь несколько страховых полисов, один полис может быть использован в нескольких страховых случаях.
331 |
332 | **Задача 3: Построение ER-диаграммы**
333 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для клиентов, полисов и страховых случаев и укажите связи между ними.
334 |
335 | ---
336 |
337 | ### Вариант 23: Книжный интернет-магазин
338 |
339 | **Задача 1: Определение модели данных для управления книгами и заказами**
340 | Создайте модель данных для учета ассортимента книг, клиентов и их заказов в интернет-магазине книг. Система должна хранить информацию о книгах, клиентах и заказах.
341 |
342 | **Задача 2: Определение связей между сущностями**
343 | Определите связи между книгами, клиентами и заказами. Один клиент может разместить несколько заказов, каждый заказ может содержать несколько книг.
344 |
345 | **Задача 3: Построение ER-диаграммы**
346 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Опишите сущности для книг, клиентов и заказов и укажите связи между ними.
347 |
348 | ---
349 |
350 | ### Вариант 24: Спортивная секция
351 |
352 | **Задача 1: Определение модели данных для учета тренеров, групп и занятий**
353 | Создайте модель данных для управления тренерами, группами и расписанием занятий в спортивной секции. Система должна учитывать тренеров, группы и занятия.
354 |
355 | **Задача 2: Определение связей между сущностями**
356 | Определите связи между тренерами, группами и занятиями. Один тренер может вести несколько групп, одна группа может иметь несколько занятий.
357 |
358 | **Задача 3: Построение ER-диаграммы**
359 | Постройте ER-диаграмму для описанной модели данных, включающую тренеров, группы и занятия.
360 |
361 | ---
362 |
363 | ### Вариант 25: Туристическая компания
364 |
365 | **Задача 1: Определение модели данных для управления турами и клиентами**
366 | Создайте модель данных для учета клиентов, туров и бронирований в туристической компании. Система должна хранить информацию о клиентах, доступных турах и их бронированиях.
367 |
368 | **Задача 2: Определение связей между сущностями**
369 | Определите связи между клиентами, турами и бронированиями. Один клиент может забронировать несколько туров, один тур может быть забронирован несколькими клиентами.
370 |
371 | **Задача 3: Построение ER-диаграммы**
372 | Постройте ER-диаграмму для описанной модели данных, включающую клиентов, туры и бронирования.
373 |
374 | ---
375 |
376 | ### Вариант 26: Система аренды автомобилей
377 |
378 | **Задача 1: Определение модели данных для управления автомобилями и арендой**
379 | Создайте модель данных для управления автопарком, клиентами и арендой автомобилей. Система должна учитывать автомобили, клиентов и их аренды.
380 |
381 | **Задача 2: Определение связей между сущностями**
382 | Определите связи между автомобилями, клиентами и арендами. Один клиент может арендовать несколько автомобилей, один автомобиль может быть арендован несколькими клиентами.
383 |
384 | **Задача 3: Построение ER-диаграммы**
385 | Постройте ER-диаграмму для описанной модели данных, включающую автомобили, клиентов и аренду.
386 |
387 | ---
388 |
389 | ### Вариант 27: Музей
390 |
391 | **Задача 1: Определение модели данных для учета экспонатов и выставок**
392 | Создайте модель данных для учета экспонатов, выставок и посетителей музея. Система должна хранить информацию о выставках, экспонатах и посетителях.
393 |
394 | **Задача 2: Определение связей между сущностями**
395 | Определите связи между экспонатами, выставками и посетителями. Один экспонат может быть частью нескольких выставок, один посетитель может посетить несколько выставок.
396 |
397 | **Задача 3: Построение ER-диаграммы**
398 | Постройте ER-диаграмму для описанной модели данных, включающую экспонаты, выставки и посетителей.
399 |
400 | ---
401 |
402 | ### Вариант 28: Стоматологическая клиника
403 |
404 | **Задача 1: Определение модели данных для учета пациентов, врачей и приемов**
405 | Создайте модель данных для учета пациентов, врачей и приемов в стоматологической клинике. Система должна учитывать пациентов, врачей и историю приемов.
406 |
407 | **Задача 2: Определение связей между сущностями**
408 | Определите связи между пациентами, врачами и приемами. Один пациент может иметь несколько приемов, один врач может проводить приемы нескольких пациентов.
409 |
410 | **Задача 3: Построение ER-диаграммы**
411 | Постройте ER-диаграмму для описанной модели данных, включающую пациентов, врачей и приемы.
412 |
413 | ---
414 |
415 | ### Вариант 29: Онлайн-курсы
416 |
417 | **Задача 1: Определение модели данных для управления курсами и студентами**
418 | Создайте модель данных для управления онлайн-курсами, студентами и прогрессом в обучении. Система должна учитывать курсы, студентов и их успеваемость.
419 |
420 | **Задача 2: Определение связей между сущностями**
421 | Определите связи между курсами, студентами и успеваемостью. Один курс может быть пройден несколькими студентами, один студент может проходить несколько курсов.
422 |
423 | **Задача 3: Построение ER-диаграммы**
424 | Постройте ER-диаграмму для описанной модели данных, включающую курсы, студентов и успеваемость.
425 |
426 | ---
427 |
428 | ### Вариант 30: Кинотеатр
429 |
430 | **Задача 1: Определение модели данных для учета фильмов, сеансов и билетов**
431 | Создайте модель данных для управления фильмами, сеансами и продажей билетов в кинотеатре. Система должна хранить информацию о фильмах, сеансах и проданных билетах.
432 |
433 | **Задача 2: Определение связей между сущностями**
434 | Определите связи между фильмами, сеансами и билетами. Один фильм может быть показан на нескольких сеансах, один сеанс может иметь несколько проданных билетов.
435 |
436 | **Задача 3: Построение ER-диаграммы**
437 | Постройте ER-диаграмму для описанной модели данных, включающую фильмы, сеансы и билеты.
438 |
439 | ### Вариант 31: Международная логистическая компания
440 |
441 | **Задача 1: Определение модели данных для управления международными грузоперевозками**
442 | Создайте модель данных для управления сложными международными грузоперевозками, включая информацию о грузах, отправителях, получателях, транспортных средствах, маршрутах и таможенных декларациях. Система должна обеспечивать учет различных этапов доставки, контроль за статусом грузов и взаимодействие между различными участниками логистической цепочки.
443 |
444 | **Задача 2: Определение связей между сущностями**
445 | Определите сложные связи между грузами, отправителями, получателями, транспортными средствами, маршрутами и таможенными декларациями. Один груз может быть отправлен несколькими этапами, используя различные транспортные средства, и проходить через несколько таможенных процедур. Один маршрут может включать несколько транспортных средств и этапов.
446 |
447 | **Задача 3: Построение ER-диаграммы**
448 | Постройте ER-диаграмму для описанной модели данных с использованием PlantUML. Включите сущности для грузов, отправителей, получателей, транспортных средств, маршрутов и таможенных деклараций, а также укажите сложные связи между ними.
449 |
450 | ---
451 |
452 | ### Обоснованное решение
453 |
454 | #### Модель данных
455 |
456 | 1. **Грузы (Cargo)**
457 | Содержит информацию о каждом грузе, который отправляется через систему. Включает идентификатор груза, описание, вес, объем и статус.
458 |
459 | 2. **Отправители (Shipper)**
460 | Содержит информацию об отправителях, включая идентификатор, название компании, контактные данные и адрес.
461 |
462 | 3. **Получатели (Receiver)**
463 | Содержит информацию о получателях, включая идентификатор, название компании, контактные данные и адрес.
464 |
465 | 4. **Транспортные средства (TransportVehicle)**
466 | Включает данные о транспортных средствах, используемых для перевозки грузов. Включает идентификатор, тип, регистрационный номер и текущее состояние.
467 |
468 | 5. **Маршруты (Route)**
469 | Определяет маршруты, по которым перевозятся грузы. Включает идентификатор маршрута, список пунктов маршрута и промежуточные остановки.
470 |
471 | 6. **Таможенные декларации (CustomsDeclaration)**
472 | Содержит информацию о таможенных декларациях, необходимых для прохождения грузов через границы. Включает идентификатор декларации, дату подачи, номер декларации и статус.
473 |
474 | #### Связи между сущностями
475 |
476 | 1. **Груз - Отправитель**
477 | Один груз может иметь одного отправителя. Связь: `Cargo` (n:1) `Shipper`.
478 |
479 | 2. **Груз - Получатель**
480 | Один груз может иметь одного получателя. Связь: `Cargo` (n:1) `Receiver`.
481 |
482 | 3. **Груз - Транспортные средства**
483 | Один груз может быть транспортирован через несколько транспортных средств. Связь: `Cargo` (n:m) `TransportVehicle` через промежуточную таблицу `CargoTransport`.
484 |
485 | 4. **Транспортное средство - Маршрут**
486 | Один маршрут может включать несколько транспортных средств. Связь: `Route` (n:m) `TransportVehicle` через промежуточную таблицу `RouteVehicle`.
487 |
488 | 5. **Груз - Маршрут**
489 | Один груз может следовать через несколько маршрутов. Связь: `Cargo` (n:m) `Route` через промежуточную таблицу `CargoRoute`.
490 |
491 | 6. **Груз - Таможенная декларация**
492 | Один груз может быть связан с несколькими таможенными декларациями. Связь: `Cargo` (n:m) `CustomsDeclaration` через промежуточную таблицу `CargoCustoms`.
493 |
494 | #### ER-диаграмма
495 |
496 | Постройте ER-диаграмму, которая визуализирует все указанные сущности и связи. Диаграмма должна показывать сложные многие-ко-многим связи и как они взаимодействуют для управления международной логистикой.
497 |
498 | ```plantuml
499 | @startuml
500 | entity "Cargo" {
501 | * CargoID
502 | --
503 | Description
504 | Weight
505 | Volume
506 | Status
507 | }
508 | entity "Shipper" {
509 | * ShipperID
510 | --
511 | CompanyName
512 | ContactInfo
513 | Address
514 | }
515 | entity "Receiver" {
516 | * ReceiverID
517 | --
518 | CompanyName
519 | ContactInfo
520 | Address
521 | }
522 | entity "TransportVehicle" {
523 | * VehicleID
524 | --
525 | Type
526 | RegistrationNumber
527 | Status
528 | }
529 | entity "Route" {
530 | * RouteID
531 | --
532 | RouteDescription
533 | }
534 | entity "CustomsDeclaration" {
535 | * DeclarationID
536 | --
537 | DeclarationNumber
538 | SubmissionDate
539 | Status
540 | }
541 |
542 | Cargo ||--o{ Shipper
543 | Cargo ||--o{ Receiver
544 | Cargo ||--o{ TransportVehicle : TransportedBy
545 | TransportVehicle ||--o{ Route : AssignedTo
546 | Cargo ||--o{ Route : Follows
547 | Cargo ||--o{ CustomsDeclaration : DeclaredBy
548 | @enduml
549 | ```
550 |
--------------------------------------------------------------------------------
/labs/lab2.md:
--------------------------------------------------------------------------------
1 | # Лабораторная работа №2 (для ФИИТ)
2 |
3 | ### Описание задачи
4 |
5 | Ваша задача заключается в проектировании структуры базы данных для различных бизнес-сценариев, а также в выполнении операций с данными, используя команды DDL (Data Definition Language) и DML (Data Manipulation Language). Задания должны решаться без использования подзапросов и JOIN.
6 |
7 | В процессе выполнения работы вам предстоит:
8 |
9 | 1. **Создать базу данных и таблицы**: Вы будете разрабатывать структуру базы данных, включая создание необходимых таблиц для хранения информации о клиентах, продуктах, заказах или других сущностях, связанных с вашей предметной областью.
10 |
11 | 2. **Наполнить таблицы данными**: Вам необходимо будет вставить записи в созданные таблицы с использованием операторов DML, чтобы подготовить базу данных к дальнейшему анализу.
12 |
13 | 3. **Выполнять операции с данными**: В ходе выполнения задач вы будете применять различные команды DML для выборки, обновления и удаления данных. Вы научитесь использовать фильтрацию, группировку, сортировку и агрегацию, чтобы извлекать и анализировать данные, что является ключевым аспектом работы с базами данных.
14 |
15 | 4. **Анализировать результаты**: Каждый из ваших запросов должен давать осмысленные результаты, которые помогут в анализе бизнес-процессов. Вы будете исследовать активность клиентов, оборачиваемость товаров и другие важные метрики.
16 |
17 | Каждому студенту предлагается решить один вариант. Номер варианта вычисляется по формуле:
18 |
19 | Номер варианта = ((n−1)mod 5)+1, где n - номер студента в списке группы
20 |
21 | ### Вариант 1
22 |
23 | Компания занимается продажей товаров через интернет-магазин. Клиенты могут заказывать различные продукты, относящиеся к нескольким категориям, от разных поставщиков. Каждый заказ может содержать несколько товаров, а стоимость заказа зависит от количества единиц товара и его цены. Также ведётся учёт поставщиков, которые поставляют товары в магазин. Необходимо обеспечить контроль за запасами на складах, анализировать активность клиентов и эффективность продаж товаров разных категорий.
24 |
25 | #### Задачи:
26 |
27 | 1. Создайте структуру для хранения данных о продуктах, клиентах и заказах. Заполните таблицы данными о товарах и клиентах.
28 |
29 | 2. Добавьте записи о нескольких заказах от клиентов, указав товары и их количество.
30 |
31 | 3. Выведите список всех товаров, отсортированных по цене.
32 |
33 | 4. Найдите всех клиентов, которые сделали заказы в определённый период времени.
34 |
35 | 5. Выведите продукты, стоимость которых находится в пределах заданного диапазона.
36 |
37 | 6. Рассчитайте общую сумму всех заказов для каждого клиента, заполнив отдельную таблицу с результатами.
38 |
39 | 7. Определите, сколько товаров было продано в каждой категории и запишите результаты в таблицу.
40 |
41 | 8. Выведите список клиентов, которые совершили заказы на сумму, превышающую определённый порог.
42 |
43 | 9. Обновите информацию о ценах на товары в одной из категорий.
44 |
45 | 10. Удалите заказы, которые были сделаны более года назад.
46 |
47 | 11. Найдите заказы, которые содержат определённое количество единиц товара.
48 |
49 | 12. Выведите первые пять записей о товарах, пропустив несколько первых записей.
50 |
51 | 13. Подсчитайте среднюю цену товаров для каждой категории и запишите результаты в отдельную таблицу.
52 |
53 | 14. Отсортируйте заказы по дате, используя только данные из одной таблицы.
54 |
55 | 15. Выведите список клиентов, которые сделали наибольшее количество заказов.
56 |
57 | ---
58 |
59 | ### Вариант 2
60 |
61 | Компания предоставляет услуги аренды недвижимости. В базе данных хранятся данные о клиентах, объектах недвижимости, доступных для аренды, а также о заключённых договорах аренды. Объекты недвижимости могут отличаться по типу, цене и доступности, а арендаторы могут заключать краткосрочные и долгосрочные договора. Необходимо вести учёт заключённых договоров аренды, контролировать статус объектов недвижимости и анализировать поведение клиентов.
62 |
63 | #### Задачи:
64 |
65 | 1. Создайте структуру для хранения данных о клиентах, объектах недвижимости и договорах аренды. Заполните таблицы данными о клиентах и объектах.
66 |
67 | 2. Добавьте записи о заключённых договорах аренды, указав клиентов и арендованные объекты.
68 |
69 | 3. Выведите список всех объектов недвижимости, отсортированных по стоимости аренды.
70 |
71 | 4. Найдите всех клиентов, которые арендовали объекты в определённый период времени.
72 |
73 | 5. Выведите объекты недвижимости, стоимость аренды которых попадает в заданные границы.
74 |
75 | 6. Рассчитайте общую стоимость всех арендных договоров для каждого клиента и запишите результаты в отдельную таблицу.
76 |
77 | 7. Определите, сколько объектов было сдано в аренду по каждому типу и сохраните результаты.
78 |
79 | 8. Выведите список клиентов, арендовавших объекты на сумму, превышающую определённое значение.
80 |
81 | 9. Обновите информацию о стоимости аренды для объектов определённого типа.
82 |
83 | 10. Удалите договора аренды, которые были заключены более года назад.
84 |
85 | 11. Найдите все договора аренды, которые были заключены на объекты с определёнными характеристиками.
86 |
87 | 12. Выведите первые пять записей об объектах, пропустив несколько первых записей.
88 |
89 | 13. Подсчитайте среднюю стоимость аренды для каждого типа недвижимости и запишите результаты.
90 |
91 | 14. Отсортируйте договора аренды по дате их заключения, используя только данные из одной таблицы.
92 |
93 | 15. Выведите список клиентов, которые заключили наибольшее количество договоров аренды.
94 |
95 | ---
96 |
97 | ### Вариант 3
98 |
99 | Производственная компания занимается изготовлением и продажей различных товаров. Продукция поступает на склады после производства, где затем распределяется по заказам клиентов. Каждое изделие имеет несколько вариантов, таких как модель, цвет и размер. Для выполнения заказов используются материалы, которые закупаются у нескольких поставщиков. Необходимо отслеживать данные о произведённых товарах, заказах клиентов, закупках материалов и работе с поставщиками.
100 |
101 | #### Задачи:
102 |
103 | 1. Создайте структуру для хранения данных о произведённых продуктах, заказах клиентов и поставках материалов. Заполните таблицы данными о продуктах и заказах.
104 |
105 | 2. Добавьте записи о произведённых продуктах и сделанных заказах.
106 |
107 | 3. Выведите список всех произведённых продуктов, отсортировав их по дате производства.
108 |
109 | 4. Найдите все заказы, выполненные в определённый период времени.
110 |
111 | 5. Выведите поставки материалов, общая стоимость которых попадает в указанные границы.
112 |
113 | 6. Рассчитайте общую стоимость всех произведённых продуктов для каждого заказа и сохраните результаты.
114 |
115 | 7. Определите, сколько товаров было произведено для каждой модели и запишите результаты.
116 |
117 | 8. Выведите заказы, в которых было произведено больше определённого количества единиц продукции.
118 |
119 | 9. Обновите информацию о ценах на материалы от одного из поставщиков.
120 |
121 | 10. Удалите записи о заказах, которые были выполнены более года назад.
122 |
123 | 11. Найдите все поставки, сделанные от определённых поставщиков.
124 |
125 | 12. Выведите первые пять записей о производственных заказах, пропустив несколько первых записей.
126 |
127 | 13. Подсчитайте среднюю стоимость материалов для каждого заказа и сохраните результаты.
128 |
129 | 14. Отсортируйте заказы по дате их выполнения.
130 |
131 | 15. Выведите список поставщиков, которые выполнили наибольшее количество поставок.
132 |
133 | ---
134 |
135 | ### Вариант 4
136 |
137 | Финансовая компания предоставляет различные услуги клиентам, такие как выдача кредитов, депозиты и страхование. Клиенты могут обращаться за разными типами услуг, каждая из которых имеет свои условия и ставки. Компания ведёт учёт заключённых договоров с клиентами, отслеживает информацию о сроках и суммах кредитов, а также условиях депозитов. Система управления позволяет анализировать активность клиентов и определять эффективность предлагаемых финансовых продуктов.
138 |
139 | #### Задачи:
140 |
141 | 1. Создайте структуру для хранения данных о клиентах, финансовых продуктах и договорах. Заполните таблицы данными о клиентах и продуктах.
142 |
143 | 2. Добавьте записи о заключённых договорах по кредитам и депозитам.
144 |
145 | 3. Выведите список всех клиентов, отсортированных по сумме заключённых договоров.
146 |
147 | 4. Найдите клиентов, которые заключили договора в определённый период времени.
148 |
149 | 5. Выведите депозиты с условиями, попадающими в указанные границы.
150 |
151 | 6. Рассчитайте общую сумму всех договоров для каждого клиента и запишите результаты.
152 |
153 | 7. Определите, сколько договоров было заключено по каждому типу финансовых продуктов.
154 |
155 | 8. Выведите клиентов, которые заключили договора на сумму, превышающую определённое значение.
156 |
157 | 9. Обновите условия депозитов для одного из типов финансовых продуктов.
158 |
159 | 10. Удалите записи о договорах, которые были заключены более года назад.
160 |
161 | 11. Найдите договора по кредитам с определёнными условиями.
162 |
163 | 12. Выведите первые пять записей о заключённых договорах, пропустив несколько первых записей.
164 |
165 | 13. Подсчитайте среднюю сумму депозитов для каждого клиента и запишите результаты.
166 |
167 | 14. Отсортируйте договора по дате их заключения, используя только данные из одной таблицы.
168 |
169 | 15. Выведите список клиентов, заключивших наибольшее количество договоров.
170 |
171 | ---
172 |
173 | ### Вариант 5
174 |
175 | Транспортная компания предоставляет услуги по аренде транспортных средств различного типа, включая легковые автомобили, грузовики и автобусы. Каждый клиент может арендовать транспортное средство на разный срок, стоимость аренды зависит от типа транспорта и длительности аренды. Необходимо вести учёт арендуемых транспортных средств, договоров аренды, а также отслеживать данные о клиентах и платежах.
176 |
177 | #### Задачи:
178 |
179 | 1. Создайте структуру для хранения данных о транспортных средствах, клиентах и договорах аренды. Заполните таблицы данными о транспортных средствах и клиентах.
180 |
181 | 2. Добавьте записи о заключённых договорах аренды, указав клиентов и арендованные транспортные средства.
182 |
183 | 3. Выведите список всех транспортных средств, отсортированных по стоимости аренды.
184 |
185 | 4. Найдите клиентов, которые арендовали транспортные средства в определённый период времени.
186 |
187 | 5. Выведите транспортные средства, стоимость аренды которых попадает в заданные границы.
188 |
189 | 6. Рассчитайте общую стоимость всех арендных договоров для каждого клиента и запишите результаты.
190 |
191 | 7. Определите количество арендованных транспортных средств для каждого типа и запишите результаты.
192 |
193 | 8. Выведите клиентов, арендовавших транспортные средства на сумму, превышающую определённое значение.
194 |
195 | 9. Обновите стоимость аренды для транспортных средств одного из типов.
196 |
197 | 10. Удалите записи о договорах аренды, которые были заключены более года назад.
198 |
199 | 11. Найдите все договора аренды для транспортных средств определённого типа.
200 |
201 | 12. Выведите первые пять записей о договорах аренды,
202 |
203 | пропустив несколько первых записей.
204 |
205 | 13. Подсчитайте среднюю стоимость аренды для каждого типа транспортных средств и запишите результаты.
206 |
207 | 14. Отсортируйте договора аренды по дате их заключения.
208 |
209 | 15. Выведите список клиентов, заключивших наибольшее количество договоров аренды.
210 |
--------------------------------------------------------------------------------
/labs/lab3.md:
--------------------------------------------------------------------------------
1 | # Темы для проектирования баз данных
2 | ### Тема 1: Учебный процесс
3 | #### Сущности:
4 | - Студенты
5 | - Курсы (Предмет)
6 | - Преподаватели
7 | - Занятия
8 | - Оценки
9 | - Кабинеты
10 | - Группы
11 |
12 | ### Тема 2: Продажи товаров
13 | #### Сущности:
14 | - Покупатели
15 | - Товары
16 | - Покупки
17 | - Отгрузки
18 | - Поставщики
19 | - Магазин/Сеть магазинов
20 |
21 | ### Тема 3: Медицинская информация
22 | #### Сущности:
23 | - Пациенты
24 | - Лекарства
25 | - Диагнозы
26 | - Врачи
27 | - Записи приемов
28 | - Больница
29 |
30 | ### Тема 4: Финансовые операции
31 | #### Сущности:
32 | - Клиенты
33 | - Счета
34 | - Платежи
35 | - Банковские транзакции
36 | - Контракты
37 | - Банк
38 |
39 | ### Тема 5: Управление персоналом
40 | #### Сущности:
41 | - Сотрудники
42 | - Должности
43 | - Навыки
44 | - Отпуска
45 | - Командировки
46 | - Компании
47 |
48 | ### Тема 6: Автомобильная промышленность
49 | #### Сущности:
50 | - Автомобили
51 | - Запчасти
52 | - Сервисные центры
53 | - Водители
54 | - Ремонтные работы
55 |
56 | ### Тема 7: Туризм и путешествия
57 | #### Сущности:
58 | - Путешественники
59 | - Авиакомпании
60 | - Отели
61 | - Туристические маршруты
62 | - Билеты
63 |
64 | ### Тема 8: Спортивные мероприятия
65 | #### Сущности:
66 | - Спортсмены
67 | - Виды спорта
68 | - Соревнования
69 | - Результаты
70 | - Команды
71 | - Спонсоры
72 |
73 | ### Тема 9: Галереи
74 | #### Сущности:
75 | - Объекты искусства
76 | - Художники
77 | - Посетители
78 | - Экскурсии
79 | - Галереи
80 |
81 |
82 | ### Тема 10: Социальные сети
83 | #### Сущности:
84 | - Пользователи
85 | - Друзья
86 | - Группы
87 | - Посты
88 | - Комментарии
89 | - Лайки
90 | - Сообщения
91 | # Основа для последующих лаб
92 |
93 | 1. Спроектировать базу данных. Подготовить ER-диаграмму
94 | 2. Создать таблицу. (Может где-то нужно будет использовать Unique, default, check, not null )
95 | 3. Заполнить данными
96 | 4. Прописать простые запросы для работы с данными. (Отображение, обновление и удаление)
97 |
98 | # 3 Лабораторная
99 |
100 | ## 1 Тема Учебный процесс
101 | 1. Выведете доп. информацию по каждому занятию. Кто учится, кто ведёт, где проводится занятие
102 | 2. Выведете для каждого студента информацию по оценкам.
103 | 3. Выведете самый частый по использованию кабинет и какое занятие проводится в нём чаще всего
104 | 4. Вывести среднее количество студентов у каждого преподавателя
105 |
106 | ## 2 Тема Продажи товаров
107 | 1. Нужно вывести статистику по товарам, где чаще продаётся и в какое время
108 | 2. Вывести информацию по покупателям. В каком магазине покупают, что покупают
109 | 3. Посчитать прибыль магазина за определённый период. Также вывести часто покупаемый товар.
110 | 4. Посчитать прибыльность каждой категории товаров. Вывести в каких магазинах чаще покупают данную категорию
111 |
112 | ## 3 Тема Медицинская информация
113 | 1. Вывести для каждого пациента количество посещений и врача, которого чаще всего посещал человек
114 | 2. Для каждого врача отобразить наиболее часто ставящийся диагноз и лекарство, которое он чаще всего назначает.
115 | 3. Вывести статистику по больницам. Самый частый пациент и самый продуктивный врач
116 | 4. Вывести эффективность лечения болезней в зависимости от больницы ( Нужно вывести среднее время лечения болезни и среднюю стоимость назначенных лекарств )
117 |
118 | ## 4 Тема Финансовые операции
119 | 1. Вывести полную информацию по клиентам, какие счета и банки
120 | 2. Определить, какие продукты (кредитные карты или депозиты) наиболее популярны среди разных типов клиентов. (в качестве типа можно использовать возраст, пол и т.д.)
121 | 3. Вывести количество контрактов для каждого банка, также среднюю сумму контрактов и максимальную
122 | 4. Вывести для каждого банка среднее количество счетов среднюю сумму платежа на одного клиента.
123 |
124 | ## 5 Тема Управление персоналом
125 | 1. Вывести для каждой компании средний возраст всех сотрудников, количество женщин и мужчин и распределение по должностям
126 | 2. Для каждого сотрудника вывести максимальное и среднее время отпуска, а также максимальное и среднее время командировок. Также нужно вывести наиболее частое направление для командировок.
127 | 3. Вывести рейтинг компании по средней продолжительности работы сотрудников.
128 | 4. Для каждой компании вывести интервал, когда больше всего работников находилось в отпуске, а также количество сотрудников в отпуске и на работе в этот момент.
129 |
130 | ## 6 Тема Автомобильная промышленность
131 | 1. Вывести топ машин, которые чаще всего ломаются и количество владельцев этих машин
132 | 2. Вывести топ используемых запчастей. Средний ценник и количество компаний, которые используют их
133 | 3. Вывести топ центров по количеству работ. Также отобразить средний ценник работ и часто используемую запчасть
134 | 4. Вывести водителей, часто используемый ими центр, полную цену всех работ и средний ценник
135 |
136 | ## 7 Тема Туризм и путешествия
137 | 1. Вывести среднюю стоимость билета в зависимости от сезона и направления.
138 | 2. Вывести рейтинг авиакомпаний по количеству проданных билетов и общей сумме выручки от их продажи.
139 | 3. Для каждого направления вывести количество путешествий по месяцам в процентах. Также вывести, кто посещает это направление чаще – мужчины или женщины.
140 | 4. Для каждой страны вывести самый посещаемый отель.
141 |
142 | ## 8 Тема Спортивные мероприятия
143 | 1. Вывести статистику о карьерных достижениях спортсменов.
144 | 2. Вывести спонсоров и статистику спонсирующих их спортсменов.
145 | 3. Для каждого вида спорта вывести количество побед и поражений
146 | 4. Вывести полную статистику по спортсменам (общее количество соревнований, количество побед, количество спонсоров и т.д. )
147 |
148 | ## 9 Тема Музеи и галереи
149 | 1. Вывести временные интервалы, когда каждая галерея наиболее загружена посетителями.
150 | 2. Вывести количество произведений каждого художника, представленных в каждой галерее. (Галерея важнее художника)
151 | 3. Вывести средний возраст посетителей каждой галереи за каждый месяц текущего года.
152 | 4. Вывести количество уникальных посетителей каждой галереи за последние 6 месяцев.
153 |
154 | ## 10 Тема Социальные сети
155 | 1. Количество постов, комментариев и лайков, сделанных каждым пользователем.
156 | 2. Вывести для определённого интервала по времени среднее количество сообщений, лайков и постов для каждого пользователя
157 | 3. Вывести количество общих друзей между двумя любыми пользователями.
158 | 4. Вывести рейтинг групп по количеству постов. Вывести также среднее количество лайков и комментарий постов для каждой группы
159 |
--------------------------------------------------------------------------------
/postgresql-docker.md:
--------------------------------------------------------------------------------
1 | # Подробная инструкция по Docker для начинающих
2 |
3 | ## 1. Что такое Docker?
4 |
5 | **Docker** — это инструмент, позволяющий разработчикам создавать, развертывать и запускать приложения в изолированных средах, называемых **контейнерами**. Контейнеры обеспечивают легкую и быструю изоляцию приложений, используя общее ядро операционной системы, что делает их более эффективными по сравнению с традиционными виртуальными машинами.
6 |
7 | ### Преимущества Docker
8 | - **Изоляция приложений:** Каждое приложение работает в своем контейнере, предотвращая конфликты зависимостей.
9 | - **Портативность:** Контейнеры могут работать на любом сервере, поддерживающем Docker.
10 | - **Эффективность:** Контейнеры запускаются быстрее и требуют меньше ресурсов.
11 |
12 | ## 2. Основные термины Docker
13 |
14 | - **Контейнер:** Изолированная среда, где запускается приложение. Контейнеры создаются из образов.
15 | - **Образ (Image):** Шаблон для создания контейнеров, включающий необходимые файлы и настройки.
16 | - **Dockerfile:** Текстовый файл с инструкциями для создания образа.
17 | - **Docker Hub:** Облачный сервис для хранения и обмена образами.
18 | - **Volume:** Механизм для хранения данных вне контейнера, позволяющий сохранять данные при его удалении.
19 | - **Docker Compose:** Инструмент для управления многоконтейнерными приложениями.
20 |
21 | ## 3. Установка Docker
22 |
23 | 1. **Скачайте и установите Docker:**
24 | - Для **Windows** и **macOS** используйте [Docker Desktop](https://www.docker.com/products/docker-desktop).
25 | - Для **Linux** следуйте инструкциям на [официальном сайте Docker](https://docs.docker.com/get-docker/).
26 |
27 | 2. **Проверьте установку:**
28 | Откройте терминал и введите:
29 | ```bash
30 | docker --version
31 | ```
32 | Если установка успешна, вы увидите версию Docker.
33 |
34 | ## 4. Основные команды Docker
35 |
36 | - **Список контейнеров:**
37 | ```bash
38 | docker ps
39 | ```
40 | Для отображения всех контейнеров (включая остановленные):
41 | ```bash
42 | docker ps -a
43 | ```
44 |
45 | - **Запуск контейнера:**
46 | ```bash
47 | docker run [OPTIONS] IMAGE
48 | ```
49 |
50 | - **Остановка контейнера:**
51 | ```bash
52 | docker stop CONTAINER_ID
53 | ```
54 |
55 | - **Удаление контейнера:**
56 | ```bash
57 | docker rm CONTAINER_ID
58 | ```
59 |
60 | - **Сборка образа из Dockerfile:**
61 | ```bash
62 | docker build -t IMAGE_NAME .
63 | ```
64 |
65 | - **Загрузка образа на Docker Hub:**
66 | ```bash
67 | docker push IMAGE_NAME
68 | ```
69 |
70 | - **Загрузка образа с Docker Hub:**
71 | ```bash
72 | docker pull IMAGE_NAME
73 | ```
74 |
75 | ## 5. Создание контейнера с PostgreSQL
76 |
77 | ### Шаг 1: Запуск контейнера с PostgreSQL
78 |
79 | 1. **Откройте терминал.**
80 |
81 | 2. **Создайте и запустите контейнер:**
82 | ```bash
83 | docker run --name my-postgres -e POSTGRES_USER=myuser -e POSTGRES_PASSWORD=mypassword -d -p 5432:5432 postgres
84 | ```
85 | - `--name my-postgres`: задает имя контейнера.
86 | - `-e POSTGRES_USER=myuser`: задает имя пользователя для PostgreSQL.
87 | - `-e POSTGRES_PASSWORD=mypassword`: задает пароль для пользователя.
88 | - `-d`: запускает контейнер в фоновом режиме.
89 | - `-p 5432:5432`: пробрасывает порт для доступа к PostgreSQL.
90 |
91 | 3. **Проверьте запуск контейнера:**
92 | ```bash
93 | docker ps
94 | ```
95 |
96 | ### Шаг 2: Утилита psql и ее возможности
97 |
98 | **psql** — это интерактивная командная строка для работы с PostgreSQL. Она позволяет выполнять SQL-запросы, управлять базами данных и получать информацию о них. Вот некоторые основные возможности psql:
99 |
100 | - **Выполнение SQL-запросов:** Вы можете вводить любые SQL-команды, такие как создание таблиц, вставка данных и выборка информации.
101 |
102 | - **Работа с базами данных:** psql позволяет создавать, удалять и управлять базами данных. Вы можете переключаться между ними с помощью команды `\c` (connect).
103 |
104 | - **Получение информации о структуре базы данных:** Команды, начинающиеся с `\`, позволяют получать информацию о базах данных, таблицах и других объектах. Например:
105 | - `\dt` — показать все таблицы в текущей базе данных.
106 | - `\d имя_таблицы` — показать структуру конкретной таблицы.
107 |
108 | - **Импорт и экспорт данных:** psql поддерживает команды для загрузки данных из файлов (`\copy`) и сохранения данных в файлы.
109 |
110 | - **Скрипты:** Вы можете выполнять SQL-скрипты, используя команду `\i имя_файла`.
111 |
112 | - **Подсказки и автозавершение:** psql поддерживает автозавершение команд, что делает его использование более удобным.
113 |
114 | ### Пример подключения к psql
115 |
116 | Чтобы подключиться к PostgreSQL через psql, выполните следующую команду:
117 |
118 | ```bash
119 | psql -h localhost -U myuser -d postgres
120 | ```
121 |
122 | - `-h localhost`: указывает адрес сервера (localhost для локального подключения).
123 | - `-U myuser`: имя пользователя, заданное при создании контейнера.
124 | - `-d postgres`: имя базы данных, к которой вы хотите подключиться (по умолчанию `postgres`).
125 |
126 | После выполнения команды введите пароль (`mypassword`), когда будет предложено. Теперь вы можете работать с базой данных через psql.
127 |
128 | ### Работа с psql из контейнера
129 |
130 | Чтобы запустить psql из контейнера, используйте команду `docker exec`:
131 |
132 | ```bash
133 | docker exec -it my-postgres psql -U myuser -d postgres
134 | ```
135 |
136 | - `-it`: позволяет взаимодействовать с контейнером.
137 | - `my-postgres`: имя вашего контейнера.
138 | - `psql -U myuser -d postgres`: команда для подключения к PostgreSQL.
139 |
140 | ## 6. Остановка и удаление контейнера
141 |
142 | 1. **Остановка контейнера:**
143 | ```bash
144 | docker stop my-postgres
145 | ```
146 |
147 | 2. **Удаление контейнера:**
148 | ```bash
149 | docker rm my-postgres
150 | ```
151 |
152 | ## Важное уведомление
153 |
154 | **Если вы сталкиваетесь с ошибкой при попытке подключения:**
155 |
156 | ```
157 | PostgresException (0x80004005): 28P01: password authentication failed for user "xxxxxxx"
158 | ```
159 |
160 | 1. **Проверьте все логины, пароли и имя базы данных.**
161 |
162 | 2. **Удалите PostgreSQL, установленный на вашей системе.**
163 |
164 | 3. **Либо измените проброс портов, например, на `5433:5432`, если порт 5432 уже занят установленным локально PostgreSQL.**
165 |
166 | ## Заключение
167 |
168 | Вы узнали о Docker, его преимуществах, основных терминах, установке, командах и создании контейнера с PostgreSQL. Используйте эту информацию для эффективного управления базами данных и приложениями в Docker. Если возникнут вопросы, обращайтесь к документации Docker или PostgreSQL.
169 |
--------------------------------------------------------------------------------
/project/architecture.md:
--------------------------------------------------------------------------------
1 | # Роль диаграмм в планировании и документировании архитектуры системы
2 |
3 | Архитектурное проектирование информационных систем требует детального планирования, которое позволяет формировать чёткое представление о структуре и взаимодействиях всех компонентов системы. Для этого используются архитектурные диаграммы, каждая из которых выполняет специфическую роль на этапах планирования, проектирования и разработки. Они помогают архитекторам, разработчикам и техническим специалистам описать ключевые аспекты системы, её взаимодействия и обеспечивают основу для согласования между участниками проекта. Ниже рассмотрены типы диаграмм, их важность в архитектурном планировании и подходы к их использованию в документации.
4 |
5 | #### 1. **Диаграмма контекста (Context Diagram)**
6 |
7 | **Описание и значение:** Диаграмма контекста представляет систему в её общем окружении, включая внешние зависимости, взаимодействия с пользователями и другими системами. Она показывает все внешние интерфейсы, с которыми система будет обмениваться данными, определяет входные и выходные точки для информации, поступающей извне.
8 |
9 | **Роль в планировании:** Диаграмма контекста важна на начальных этапах, поскольку позволяет всем участникам проекта получить общее представление о границах системы и её окружении. Она упрощает идентификацию внешних взаимодействий и интерфейсов, что способствует формированию чётких требований. Это первый шаг к структурированию архитектуры, который задаёт общее направление разработки.
10 |
11 | **Подход к документированию:** В документации диаграмма контекста описывает внешний контур системы, роли участников и характер данных, с которыми система будет работать. Она также указывает на возможные риски и узкие места при взаимодействии с внешними системами, облегчая их прогнозирование и устранение на раннем этапе.
12 |
13 | #### 2. **Диаграмма последовательностей (Sequence Diagram)**
14 |
15 | **Описание и значение:** Диаграмма последовательностей показывает процесс выполнения операций в системе, отражая последовательность взаимодействий между её компонентами. Она отображает, как компоненты системы (такие как сервисы, модули, базы данных) обмениваются сообщениями, чтобы выполнить запрос.
16 |
17 | **Роль в планировании:** Диаграмма последовательностей важна для анализа и оптимизации рабочих процессов, помогая выявить возможные проблемные места, такие как дублирующиеся запросы или циклические зависимости. Она помогает установить порядок и логику взаимодействий, что особенно важно при реализации бизнес-логики, требующей чёткой последовательности операций.
18 |
19 | **Подход к документированию:** В документации диаграммы последовательностей используются для иллюстрации рабочих процессов и координации взаимодействий между компонентами. Они предоставляют детализированное описание процессов и помогают избежать ошибок на этапе разработки, благодаря наглядному представлению логики и временных связей между действиями.
20 |
21 | #### 3. **Диаграмма развертывания (Deployment Diagram)**
22 |
23 | **Описание и значение:** Диаграмма развертывания описывает физическое размещение компонентов системы и их взаимодействие на уровне инфраструктуры. Она отображает все серверы, хранилища данных, сети и другие компоненты инфраструктуры, необходимые для корректного функционирования системы.
24 |
25 | **Роль в планировании:** Эта диаграмма помогает сформировать представление о необходимых ресурсах и конфигурации сети, обеспечивая баланс между производительностью, безопасностью и доступностью системы. Диаграмма развертывания также способствует правильной организации сетевой безопасности, поскольку позволяет определить каналы передачи данных и требования к безопасности.
26 |
27 | **Подход к документированию:** В документации диаграммы развертывания описываются физические аспекты системы, такие как доступные ресурсы и топология сети. Они также служат основой для настройки и развертывания системы, предоставляя всем участникам проекта наглядную информацию о том, где и как размещены ключевые компоненты системы.
28 |
29 | #### 4. **Диаграмма вариантов использования (Use Case Diagram)**
30 |
31 | **Описание и значение:** Диаграмма вариантов использования описывает функциональные возможности системы с точки зрения пользователя, определяя взаимодействия, которые пользователи смогут выполнять. Она отражает ключевые задачи, которые пользователи будут решать с помощью системы, и роли, которые они при этом играют.
32 |
33 | **Роль в планировании:** Диаграмма вариантов использования является основой для определения и проверки требований, что помогает разрабатывать функции, которые реально нужны пользователям. Эта диаграмма помогает выявить зоны функциональной ответственности, задаёт контекст для взаимодействий пользователя с системой и определяет права доступа.
34 |
35 | **Подход к документированию:** В документации диаграмма вариантов использования описывает функциональные требования системы, структурирует их и позволяет наглядно представить, как пользователи взаимодействуют с системой. Она служит основой для обсуждения требований, помогает корректировать бизнес-логику и формулировать ограничения системы.
36 |
37 | #### 5. **Схема базы данных (Database Schema)**
38 |
39 | **Описание и значение:** Схема базы данных описывает структуру и связи таблиц, полей и других объектов базы данных, обеспечивая хранение и целостность данных в системе. Она иллюстрирует, как данные организованы, каковы их типы и как они связаны друг с другом.
40 |
41 | **Роль в планировании:** Эта диаграмма важна для планирования логической и физической структуры данных. Она помогает избежать избыточности, оптимизировать процессы выборки и обновления данных, что повышает производительность и целостность системы. Она также определяет требования к индексации и нормализации данных, чтобы минимизировать вероятность ошибок и повысить эффективность обработки данных.
42 |
43 | **Подход к документированию:** Схема базы данных включает в документацию подробное описание структуры данных, что облегчает её использование и обслуживание. Она определяет все атрибуты данных и их связи, помогает оптимизировать запросы и организовать хранение данных для обеспечения максимальной эффективности.
44 |
45 | ---
46 |
47 | ### Подходы к проектированию и документированию архитектуры
48 |
49 | Проектирование и документирование архитектуры систем представляет собой процесс, требующий участия как технических, так и бизнес-специалистов. В зависимости от масштаба и специфики проекта используются различные подходы к документированию архитектуры:
50 |
51 | 1. **Модульное проектирование:** Это подход, при котором каждая диаграмма описывает отдельные модули системы, что делает возможным независимую разработку отдельных компонентов. Такой подход упрощает внесение изменений в архитектуру и её масштабирование.
52 |
53 | 2. **Итеративное документирование:** Этот метод предполагает создание и доработку документации по мере разработки проекта. Итеративный подход подходит для Agile-сред, так как документация обновляется на каждом этапе, обеспечивая актуальную информацию для разработчиков.
54 |
55 | 3. **Централизованное хранение документации:** Использование общих платформ (например, Confluence, GitHub, Notion) для документирования диаграмм и архитектуры позволяет разработчикам и заинтересованным сторонам легко получать доступ к актуальной информации. Это помогает обеспечить слаженность команды и облегчает сотрудничество.
56 |
57 | 4. **Многоуровневая документация:** В этом подходе документация организуется на разных уровнях: от высокоуровневого описания системы до детализированных диаграмм для каждого модуля. Это позволяет адаптировать содержание документации для разных участников проекта (например, руководителей и разработчиков).
58 |
59 | ### Выводы
60 |
61 | Архитектурные диаграммы — это ключевые инструменты для описания и документирования структуры системы, её функциональных возможностей и связей. Каждая диаграмма выполняет свою роль, начиная от описания внешних взаимодействий до детализации внутренних процессов, и помогает сформировать полное и согласованное представление системы. Подходы к проектированию и документированию архитектуры должны быть адаптированы к специфике проекта, что позволяет минимизировать риски и обеспечивать чёткую координацию всех участников разработки.
62 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | ### Примерный план курса
2 |
3 | **1. Лабораторная работа: Моделирование данных, реляционная алгебра**
4 | - Теоретическая часть:
5 | - Введение в реляционные базы данных.
6 | - Основные концепции реляционной алгебры: отношение, кортеж, атрибут.
7 | - Операции реляционной алгебры: выборка, проекция, объединение, разность, декартово произведение, деление.
8 | - Концепции нормализации данных: 1NF, 2NF, 3NF.
9 | - Первичные и внешние ключи, сущности и связи.
10 | - Практическая часть:
11 | - Построение ER-диаграмм для предметной области.
12 | - Преобразование ER-диаграмм в реляционные схемы.
13 | - Реализация простой базы данных в PostgreSQL (создание таблиц).
14 |
15 | **2. Лабораторная работа: Архитектура PostgreSQL, компоненты SQL (DDL, DML)**
16 | - Теоретическая часть:
17 | - Архитектура PostgreSQL: процессы (postmaster, worker, autovacuum), управление памятью.
18 | - Структура базы данных: базы, схемы, таблицы, индексы, роли.
19 | - Введение в SQL: компоненты DDL, DML.
20 | - Создание и изменение структуры базы данных с использованием DDL.
21 | - Операции вставки, удаления, обновления данных (DML).
22 | - Практическая часть:
23 | - Создание базы данных и таблиц в PostgreSQL.
24 | - Выполнение операций с данными: вставка, обновление, удаление.
25 | - Управление структурой таблиц: добавление, изменение столбцов.
26 |
27 | **3. Лабораторная работа: План выполнения запросов, сложные запросы, подзапросы**
28 | - Теоретическая часть:
29 | - Как PostgreSQL выполняет запросы: планировщик, оптимизатор.
30 | - Анализ и оптимизация запросов с использованием EXPLAIN и EXPLAIN ANALYZE.
31 | - Подзапросы: коррелированные и некоррелированные подзапросы.
32 | - Операции фильтрации данных (`WHERE`, `HAVING`).
33 | - Агрегация данных: функции `COUNT()`, `SUM()`, `AVG()`, `MIN()`, `MAX()`.
34 | - Сортировка и ограничение результата: `ORDER BY`, `LIMIT`.
35 | - Практическая часть:
36 | - Выполнение сложных запросов с использованием подзапросов.
37 | - Использование агрегационных функций для анализа данных.
38 | - Оптимизация запросов с использованием EXPLAIN.
39 |
40 | **4. Лабораторная работа: JOIN и UNION**
41 | - Теоретическая часть:
42 | - Операция соединения таблиц: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN.
43 | - Объединение данных: UNION, UNION ALL, INTERSECT, EXCEPT.
44 | - Пример использования операций соединения для сложных запросов.
45 | - Практическая часть:
46 | - Выполнение запросов с различными типами соединений.
47 | - Объединение результатов из нескольких таблиц с использованием UNION.
48 | - Работа с множественными объединениями (многоуровневые JOIN).
49 |
50 | **5. Лабораторная работа: Хранимые процедуры, функции, триггеры, PL/pgSQL**
51 | - Теоретическая часть:
52 | - Введение в процедурные возможности PostgreSQL.
53 | - Хранимые функции: создание, вызов, использование параметров.
54 | - PL/pgSQL: циклы, условия, переменные.
55 | - Триггеры: типы триггеров, практическое использование для автоматизации.
56 | - Практическая часть:
57 | - Создание простых функций и процедур на PL/pgSQL.
58 | - Реализация триггеров для обеспечения целостности данных.
59 | - Пример использования процедур для обработки бизнес-логики.
60 |
61 | **6. Лабораторная работа: TCL (Transaction Control Language)**
62 | - Теоретическая часть:
63 | - Основы транзакций в PostgreSQL: атомарность, консистентность, изолированность, долговечность (ACID).
64 | - Управление транзакциями: `BEGIN`, `COMMIT`, `ROLLBACK`, `SAVEPOINT`.
65 | - Уровни изоляции транзакций: READ COMMITTED, REPEATABLE READ, SERIALIZABLE.
66 | - Практическая часть:
67 | - Выполнение операций в рамках транзакций.
68 | - Управление транзакциями при возникновении ошибок.
69 | - Пример работы с уровнями изоляции для предотвращения проблем с параллелизмом.
70 |
71 | **7. Лабораторная работа: DCL, взаимодействие с БД в клиентских приложениях**
72 | - Теоретическая часть:
73 | - Управление правами пользователей: `GRANT`, `REVOKE`.
74 | - Роли и группы в PostgreSQL, настройка доступа к базам данных.
75 | - Взаимодействие клиентских приложений с базой данных (Python, Java, etc.).
76 | - Основы ORM (Object-Relational Mapping).
77 | - Практическая часть:
78 | - Настройка ролей и прав доступа для пользователей.
79 | - Создание простого приложения для взаимодействия с PostgreSQL.
80 | - Интеграция базы данных в клиентское приложение через ORM (например, SQLAlchemy, Hibernate).
81 |
--------------------------------------------------------------------------------