├── 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 | --------------------------------------------------------------------------------