PostgreSQL: Задания и Основные команды SQL

Делать в этом компиляторе

 

Тема 1 «Создание/изменение/удаление таблиц»

Пример https://www.schoolsw3.com/sql/sql_create_table.php

Тема 2 «Заполнение таблиц»

Пример https://www.schoolsw3.com/sql/sql_insert.php

Тема 3 «Создание связей»

ALTER TABLE enrollments
ADD CONSTRAINT enrollments_student_id_fk
FOREIGN KEY (student_id) REFERENCES students(id)
ON DELETE CASCADE;

Типы данных

https://www.schoolsw3.com/sql/sql_datatypes.php

Если нету интернета, то скидываете в ПСК ХАБ id: 1039918

🎯 Цель

Освоить проектирование реляционной базы данных и написание DDL-запросов (CREATE TABLE, ключи, ограничения).

 

 

📖 Контекст

Вам поручено создать базу данных для автоматизации учёта студентов 2-го курса факультета Информационных технологий. В БД должны храниться данные о:

  • факультетах и специальностях,
  • учебных группах,
  • студентах,
  • дисциплинах текущего семестра,
  • результатах сдачи зачётов и экзаменов.
 

Требуется реализовать нормализованную структуру (3НФ), избегая дублирования данных , .

 

 

🧩 Схема БД (описание связей)

 
 
 
faculty
faculty_id(PK),name
Например:«Информационные технологии»
specialty
specialty_id(PK),code,name,faculty_id(FK)
Например:09.03.01 — «Информатика и ВТ»
study_group
group_id(PK),number,specialty_id(FK),year_admission
Например:«ИВТ-22-1», год поступления — 2022
student
student_id(PK),surname,name,patronymic,group_id(FK),email
Личные данные студента
subject
subject_id(PK),name,hours,form_control
Например:«Базы данных», 72 ч, форма — «Экзамен»
grade
grade_id(PK),student_id(FK),subject_id(FK),value,date
Оценки: 2–5 или«зачтено»/«не зачтено»

🔹 Связи:

  • Одна специальность → одна группа (или несколько), одна группа → один факультет.
  • Один студент → одна группа.
  • Один студент может сдавать несколько предметов; один предмет — у многих студентов → связь многие-ко-многим через grade , .
 

 
 

💡 Подсказки

  • Используйте SERIAL или INT AUTO_INCREMENT для автоинкремента (зависит от СУБД).
  • Внешние ключи связывайте строго по логике «один-ко-многим» , .
  • Для хранения «зачтено»/«не зачтено» и чисел в одном поле можно использовать VARCHAR или отдельный столбец is_pass (BOOLEAN).

📖 Контекст
Вам поручено разработать базу данных для электронного каталога научно-технической библиотеки университета. В системе должны храниться сведения о:

 
  • читателях (студентах и преподавателях),
  • книгах и учебных пособиях,
  • издательствах,
  • выдачах и возвратах,
  • резервировании литературы.
 

Требуется реализовать нормализованную структуру (3НФ), исключив избыточность и обеспечив целостность данных.

 

 

🧩 Схема БД (описание связей)

 
 
 
 
publisher
publisher_id(PK),name,city,year_founded
Например:«ДМК Пресс», Москва, 1993
book
book_id(PK),isbn,title,author,year,pages,publisher_id(FK),available_copies
available_copies— сколько экземпляров в наличии
reader
reader_id(PK),surname,name,email,role,enroll_date
role:'студент'/'преподаватель';enroll_date— дата регистрации
loan
loan_id(PK),reader_id(FK),book_id(FK),issue_date,due_date,return_date
return_dateможет бытьNULL, если книга ещё не возвращена
reservation
res_id(PK),reader_id(FK),book_id(FK),request_date,status
status:'ожидает','выдано','отменено'

🔹 Связи:

  • Одно издательство → много книг, одна книга → одно издательство.
  • Один читатель → много выдач/резервирований.
  • Одна книга → много выдач (по разным экземплярам и во времени) — связь многие-ко-многим реализована через loan и reservation.
 

 

✍️ Задание

  1. Напишите DDL-скрипт: создайте все 5 таблиц с корректными:

    • первичными (PRIMARY KEY) и внешними ключами (FOREIGN KEY),
    • типами данных (VARCHAR, DATE, INT, BOOLEAN и др.),
    • ограничениями (NOT NULL, CHECK, DEFAULT).

      Например: CHECK (role IN ('студент', 'преподаватель')), DEFAULT CURRENT_DATE для enroll_date.

  2. Вставьте по 2–3 тестовые записи в каждую таблицу (DML: INSERT).

  3. (Дополнительно) Напишите один из запросов:

    • Вывести всех студентов, у которых просрочены книги (return_date IS NULL AND due_date < CURRENT_DATE).
    • Для каждой книги — сколько раз её брали (включая текущие выдачи).
    • Создать представление:
      Читатель | Книга | Выдана | Срок | Статус (вовремя/просрочка).
 

 

💡 Подсказки

  • Используйте SERIAL (PostgreSQL) или AUTO_INCREMENT (MySQL) для автоинкрементных PK.
  • Для дат — тип DATE; для due_date можно использовать issue_date + INTERVAL '14 days'.
  • Чтобы избежать конфликта «одна книга — один экземпляр», можно ввести таблицу copy (экземпляр книги), но в рамках задания допустимо использовать available_copies как упрощение.
  • Внешние ключи должны обеспечивать каскадное удаление или блокировку при попытке нарушить целостность.

📖 Контекст

Вам поручено разработать базу данных для электронной регистратуры университетской поликлиники. В системе должны храниться сведения о:

 
  • пациентах (студентах и сотрудниках),
  • врачах и их специализациях,
  • приёмах (записях на приём),
  • диагнозах и выданных рецептах,
  • кабинетах и расписании приёмов.
 

Требуется реализовать нормализованную структуру (3НФ), исключив избыточность и обеспечив целостность данных.

 

 

🧩 Схема БД (описание сущностей и связей)

 
Таблица
Поля
Примечания
patient
patient_id (PK), surname, name, email, role, enroll_date, phone
role: 'студент' / 'сотрудник'
doctor
doctor_id (PK), surname, name, specialization, cabinet, hire_date
specialization: 'терапевт', 'хирург', 'офтальмолог' и др.
appointment
app_id (PK), patient_id (FK), doctor_id (FK), app_datetime, status, diagnosis, prescription
status: 'запланирован', 'выполнен', 'отменён'
schedule
sched_id (PK), doctor_id (FK), day_of_week, start_time, end_time
Например: пн, 9:00–15:00
specialization
spec_id (PK), name, description
Например: name = 'кардиология'

🔹 Связи:

  • Один пациент → много записей.
  • Один врач → одна специализация (многие к одному), может работать в одном кабинете.
  • Один врач → много записей и одно расписание.
  • Расписание — слабая сущность, зависящая от врача.
 

 

✍️ Задание

  1. DDL: Напишите скрипт создания всех 5 таблиц с:
    • корректными PRIMARY KEY и FOREIGN KEY,
    • типами данных (VARCHAR, TIMESTAMP, TIME, INT, ENUM/CHECK),
    • ограничениями (NOT NULL, CHECK, DEFAULT).
     
     
  2. DML: Вставьте по 2–3 тестовые записи в каждую таблицу (INSERT).
  3. (Дополнительно) Напишите один из запросов:
    • Вывести пациентов, у которых есть неотменённые записи на сегодня.
    • Для каждого врача — сколько приёмов он провёл за последнюю неделю.
    • Создать представление: Пациент | Врач | Специализация | Дата приёма | Статус
 

 

💡 Подсказки

  • Используйте SERIAL (PostgreSQL) или AUTO_INCREMENT (MySQL) для PK.
  • Для временных меток — TIMESTAMP; для времени начала/окончания — TIME.
  • Чтобы избежать неконсистентности, внешние ключи должны включать ON DELETE RESTRICT или ON UPDATE CASCADE.
  • Специализация может быть вынесена в отдельную таблицу для гибкости — как сделано выше.

📖 Контекст

Вам поручено спроектировать реляционную базу данных для частной стоматологической клиники «Улыбка+». Система должна поддерживать:

 
  • учёт пациентов и их анамнеза,
  • расписание работы врачей (стоматологов),
  • запись на приёмы, включая тип процедуры,
  • ведение истории лечения (проведённые манипуляции, использованные материалы),
  • учёт кабинетов и оборудования,
  • выставление счётов и оплат.
 

 

🧩 Схема БД (сущности и связи)

 
Таблица
Поля
Примечания
patient
patient_id (PK), full_name, birth_date, phone, email, address, medical_history
medical_history — текст (аллергии, хронические болезни)
dentist
dentist_id (PK), full_name, specialty, license_num, hire_date
specialty: ‘терапевт’, ‘хирург’, ‘ортодонт’, ‘имплантолог’
procedure_type
proc_id (PK), name, description, base_price
Например: ‘пломбирование’, ‘удаление зуба’, ‘отбеливание’
appointment
app_id (PK), patient_id (FK), dentist_id (FK), cabinet_id (FK), app_datetime, status, notes
status: ‘запланирован’, ‘выполнен’, ‘отменён’, ‘ожидает оплаты’
treatment_log
log_id (PK), app_id (FK), proc_id (FK), performed_at, materials_used, tooth_num, notes
tooth_num — номер зуба по ВОЗ (11–48)
cabinet
cabinet_id (PK), room_num, equipment_list
equipment_list — например: ‘стомат. установка A-dec 500’
invoice
invoice_id (PK), app_id (FK), issue_date, total_amount, paid, payment_method
paid: BOOLEAN, payment_method: ‘наличные’, ‘карта’, ‘онлайн’

🔹 Связи:

  • Один пациент → много записей (appointment).
  • Один врач → много записей; у одного врача может быть одна или несколько специализаций (можно расширить до связи многие-ко-многим, если нужно).
  • Одна запись (appointment) → одна или несколько записей в treatment_log (один приём — несколько манипуляций).
  • Каждая запись привязана к одному кабинету.
  • Каждая запись (appointment) → не более одного счёта (invoice), но счёт создаётся только после завершения приёма.
 

 

✍️ Задание

DDL

Напишите SQL-скрипт для создания всех таблиц:

  • Используйте SERIAL / INT AUTO_INCREMENT для PK.
  • Укажите NOT NULL, CHECK (например, tooth_num BETWEEN 11 AND 48), DEFAULT.
  • Настройте внешние ключи с ON DELETE RESTRICT / ON UPDATE CASCADE.
  • Для перечислений (status, payment_method) используйте ENUM (MySQL) или CHECK(... IN (...)) (PostgreSQL).
 

DML

Выполните:

  • По 2–3 INSERT в каждую таблицу (реалистичные данные: ФИО, даты, цены).
  • Дополнительно: напишите один из запросов:
    1. Вывести список пациентов, у которых есть незавершённые приёмы (статус ≠ ‘выполнен’) в ближайшие 3 дня.
    2. Для каждого врача — суммарную выручку за последний месяц (по оплаченным счетам).
    3. Создать представление:
      patient_name | dentist_name | procedure_name | app_date | paid_status
 

💡 Подсказки

  • Подумайте: нужно ли вынести specialty в отдельную таблицу? Почему?
  • Как обеспечить, что счёт (invoice) создаётся только для завершённого приёма? (Подсказка: триггеры или прикладная логика?)
  • Как избежать дублирования цены процедуры в treatment_log, если base_price может со временем меняться?
 

📖 Контекст (обновлённый)

Вам поручено спроектировать реляционную базу данных для частной комплексной стоматологической клиники «ДентАрт», специализирующейся на цифровой диагностике, эстетике и протезировании. Система должна поддерживать:

 
  • Учёт пациентов, включая цифровые 3D-модели (ссылки на файлы в облаке).
  • Учёт врачей с возможностью нескольких специализаций.
  • Запись на приёмы с привязкой к процедуре, кабинету и возможностью повторного визита (например, для установки коронки).
  • Детальную историю лечения с поддержкой множественных зубов на одну манипуляцию (через отдельную связь).
  • Учёт кабинетов, оборудования и их калибровок/сервиса.
  • Выставление счетов до и после приёма (предоплата, постоплата, частичная оплата).
  • Систему лояльности: 1 рубль = 1 балл → скидка 1% за 100 баллов.
 

 

🧩 Схема БД (уточнённая)

 
Таблица
Поля
Примечания
patient
patient_id (PK), full_name, birth_date, phone, email, address, medical_history, 3d_scan_url, loyalty_points (INT DEFAULT 0)
3d_scan_url — JSON-массив ссылок (например: ["https://storage/123.stl", "https://storage/123.jpg"])
specialty
specialty_id (PK), name, description
Справочник: 'терапевт', 'хирург', 'ортодонт', 'ортопед', 'эстетист', 'цифровой дизайнер'
dentist
dentist_id (PK), full_name, hire_date
Без поля specialty — связь многие-ко-многим через dentist_specialty
dentist_specialty
dentist_id (FK), specialty_id (FK)
Многие-ко-многим: врач может иметь ≥1 специализацию
procedure_category
cat_id (PK), name
'терапия', 'хирургия', 'ортопедия', 'эстетика', 'диагностика'
procedure_type
proc_id (PK), cat_id (FK), name, description, base_price
Примеры: 'цифровой оттиск (iTero)', 'керамическая винир (E.max)', 'установка импланта (Nobel Biocare)'
procedure_price_history
history_id (PK), proc_id (FK), price, valid_from, valid_to
Для отслеживания изменения цен во времени. valid_to = NULL → действующая цена
cabinet
cabinet_id (PK), room_num, floor, is_digital (BOOLEAN), equipment_list (TEXT)
is_digital — поддерживает ли кабинет 3D-оборудование
appointment
app_id (PK), patient_id (FK), dentist_id (FK), cabinet_id (FK), app_datetime, status, notes, parent_app_id (FK → self)
status: 'запланирован', 'в работе', 'выполнен', 'отменён', 'ожидает оплаты', 'требует повтора'<br>parent_app_id — ссылка на первичный приём (например: подготовка → установка коронки)
appointment_procedure
app_proc_id (PK), app_id (FK), proc_id (FK), performed_at, materials_used, notes
Один приём — несколько процедур. Отделено от зубов.
tooth_involved
app_proc_id (FK), tooth_code
tooth_code: VARCHAR(2) — поддержка 11–48 (постоянные) и 51–85 (молочные). CHECK: tooth_code ~ '^[1-8][1-8]$'
payment_method
method_id (PK), name
'наличные', 'банковская карта', 'онлайн (СБП)', 'рассрочка', 'страховой полис'
invoice
invoice_id (PK), app_id (FK), issue_date, due_date, total_amount, paid_amount, method_id (FK), is_final (BOOLEAN DEFAULT FALSE)
paid_amount ≤ total_amount. is_final = TRUE — счёт закрыт (полная оплата). Можно выставлять несколько частичных счетов на один приём.
loyalty_points
log_id (PK), patient_id (FK), invoice_id (FK), points_earned, points_used, change_date
Запись всех изменений баллов (история). points_used ≥ 0, points_earned ≥ 0

🔹 Связи (обновлённые):

  • Один пациент → много записей → много процедур → много зубов.
  • Один счёт (invoice) → привязан к одному приёму, но у одного приёма может быть несколько счетов (частичная оплата).
  • Только счёт с is_final = TRUE и paid_amount = total_amount считается полностью оплаченным.
  • Баллы начисляются при оплате (invoice.paid_amount > 0), с возможностью списания при следующем визите.
 

 

✍️ Задание

DDL

Напишите SQL-скрипт (PostgreSQL-совместимый), включающий:

 

✅ Все таблицы выше
✅ Первичные и внешние ключи (ON DELETE RESTRICT, ON UPDATE CASCADE, где уместно)
NOT NULL, DEFAULT, CHECK-ограничения (особенно для tooth_code, email, paid_amount ≤ total_amount)
ENUM не использовать — вместо этого справочники или CHECK (col IN (...))
✅ Отдельное ограничение: CHECK (paid_amount >= 0 AND paid_amount <= total_amount) в invoice

 

⚠️ Подумайте: как обеспечить, что loyalty_points обновляется только при подтверждённой оплате? (Подсказка: триггер AFTER UPDATE ON invoice)

 

 

DML

  1. Вставьте по 2–3 реалистичных строки в каждую таблицу.
    Примеры реалистичных данных:

    • ФИО: Иванова Анна Сергеевна, Дроздов Артём Олегович
    • Процедуры: 'Цифровой оттиск челюсти (iTero)', 'Установка циркониевой коронки', 'Художественная реставрация 1 зуба'
    • 3d_scan_url: '["https://dentart.cloud/scans/p123_upper.stl", "https://dentart.cloud/scans/p123_lower.jpg"]'
    • tooth_code: '24' (постоянный), '75' (молочный)
    • parent_app_id: укажите, если приём — повторный
     
    • Вывести: procedure_name, категория, кол-во выполнений, суммарная выручка, ср. чек
    • Только оплаченные (is_final = TRUE) и paid_amount = total_amountВыберите ОДИН из трёх запросов ниже и напишите его:
       

      a) Пациенты с неполностью оплаченными услугами за последние 30 дней:

      • Вывести: patient_name, app_datetime, procedure_name, total_amount, paid_amount, остаток
      • Только приёмы со статусом 'выполнен' и paid_amount < total_amount
      • Отсортировать по остатку (по убыванию)
       

      b) Топ-3 самых прибыльных процедур за квартал (по сумме paid_amount):

📖 Контекст (обновлённый)

Вам поручено спроектировать реляционную базу данных для частного автомобильного сервисного центра премиум-класса «Авто-Элит», специализирующегося на:

 
  • Диагностике с помощью цифровых сканеров (например, ISTA, TechTool, Tesla Diagnostics)
  • Ремонте ДВС, гибридов и электромобилей
  • Обслуживании под ключ (включая мойку, химчистку, детейлинг)
  • Учёте запчастей (новые/OEM/восстановленные/аналоги)
  • Гарантийных и постгарантийных работах
  • Лояльности: 1 рубль = 1 балл → 100 баллов = 500 ₽ скидки на следующее ТО
 

Система должна поддерживать:

 
  • Учёт клиентов и их автомобилей (VIN, госномер, марка/модель, год)
  • Учёт мастеров с возможностью нескольких специализаций (двигатель, электрика, подвеска, кузов)
  • Запись на ТО/ремонт с привязкой к автомобилю, мастеру, боксу и возможностью повторного визита (например: диагностика → заказ запчастей → ремонт)
  • Детальную историю работ с поддержкой нескольких запчастей на одну операцию (через отдельную связь)
  • Учёт боксов и оборудования (подъёмники, сканеры, зарядные станции), их калибровок и ТО
  • Выставление смет до и после работ (предоплата, постоплата, частичная оплата)
  • Систему лояльности: 1 ₽ = 1 балл → каждые 100 баллов = фиксированная скидка 500 ₽ (не %, а абсолютная сумма)
 

 

🧩 Схема БД (уточнённая)

 
Таблица
Поля
Примечания
client
client_id (PK), full_name, birth_date, phone, email, address, loyalty_points (INT DEFAULT 0)
 
vehicle
vin (PK), client_id (FK), brand, model, year, license_plate, is_ev (BOOLEAN), diag_report_url (TEXT)
vin — VARCHAR(17), CHECK длины и формата<br>diag_report_url — JSON-массив ссылок
specialty
specialty_id (PK), name, description
‘двигатель’, ‘электрика’, ‘подвеска’, ‘кузов’, ‘диагностика’, ‘детейлинг’
mechanic
mechanic_id (PK), full_name, hire_date
Без specialty — связь M:N через mechanic_specialty
mechanic_specialty
mechanic_id (FK), specialty_id (FK)
Многие-ко-многим
work_category
cat_id (PK), name
‘ТО’, ‘ремонт’, ‘диагностика’, ‘детейлинг’, ‘гарантийный’
work_type
work_id (PK), cat_id (FK), name, description, base_price
‘ТО-10000’, ‘ремонт ГРМ’, ‘замена подшипника ступицы’, ‘полировка кузова’, ‘обновление ПО (Tesla)’
work_price_history
history_id (PK), work_id (FK), price, valid_from, valid_to
valid_to IS NULL → актуальная цена
bay
bay_id (PK), bay_num, floor, is_ev_ready (BOOLEAN), equipment_list (TEXT)
is_ev_ready — поддержка зарядки + изоляции для ЭМ
service_order
order_id (PK), vin (FK), mechanic_id (FK), bay_id (FK), order_datetime, status, notes, parent_order_id (FK → self)
status: ‘запланирован’, ‘в работе’, ‘выполнен’, ‘отменён’, ‘ожидает оплаты’, ‘требует запчастей’<br>parent_order_id — для цепочки (диагностика → заказ → ремонт)
order_work
order_work_id (PK), order_id (FK), work_id (FK), performed_at, hours_spent, notes
Один заказ — много работ
part_used
order_work_id (FK), part_code, quantity, unit_price, is_oem (BOOLEAN)
part_code — артикул (VARCHAR, напр., 'A2040101234', 'TES-11223344')<br>quantity > 0, unit_price >= 0
payment_method
method_id (PK), name
‘наличные’, ‘карта’, ‘онлайн’, ‘кредит’, ‘страховка’
invoice
invoice_id (PK), order_id (FK), issue_date, due_date, total_amount, paid_amount, method_id (FK), is_final (BOOLEAN DEFAULT FALSE)
CHECK (paid_amount >= 0 AND paid_amount <= total_amount)
loyalty_log
log_id (PK), client_id (FK), invoice_id (FK), points_earned, points_used, change_date
points_used ≥ 0, points_earned ≥ 0

 

✍️ Задание

✅ DDL

Напишите PostgreSQL-совместимый SQL-скрипт, включающий:

 
  • Все таблицы выше
  • Первичные и внешние ключи (ON DELETE RESTRICT, ON UPDATE CASCADE, где уместно)
  • NOT NULL, DEFAULT, CHECK-ограничения:
    • vin: длина 17, только буквы/цифры, исключая I/O/Q
    • email: базовая проверка через LIKE '%@%.%'
    • paid_amount ≤ total_amount
    • tooth_code → заменяется на part_code: допустимы цифры, буквы, символы '-', '_', '.'
  • Не использовать ENUM — только справочники или CHECK (status IN (...))
 

💡 Подсказка по триггеру: написать TRIGGER AFTER UPDATE ON invoice → если NEW.paid_amount > OLD.paid_amount AND NEW.is_final = TRUE, начислить баллы (points_earned = NEW.paid_amount), и, возможно, списать (points_used) при создании счёта (это можно учесть в логике приложения или через второй триггер/функцию).

 

 

✅ DML

Вставьте по 2–3 реалистичных строки в каждую таблицу.

 

Примеры реалистичных данных:

 
  • ФИО клиентов: Смирнова Екатерина Дмитриевна, Петров Илья Андреевич
  • Машины:
    • VIN: WDD1770421J123456, brand: Mercedes-Benz, model: E300, year: 2022, license_plate: А123ВС77, is_ev: false
    • VIN: 5YJ3E1EA9MF123789, brand: Tesla, model: Model Y, year: 2023, license_plate: Т999ОК777, is_ev: true
     
  • diag_report_url: '["https://autocloud.ru/diag/WDD177_20241201.json", "https://autocloud.ru/diag/WDD177_dtc.pdf"]'
  • work_type:
    • 'Полная диагностика ходовой (3D-развал/схождение)'
    • 'Замена охлаждающей жидкости инвертора (Tesla)'
    • 'Компьютерная полировка кузова (3 этапа)'
     
  • parent_order_id: укажите, если заказ — продолжение (например, диагностика → замена амортизаторов)

🎓 Контекст (обновлённый)

Вам поручено спроектировать реляционную базу данных для частного образовательного центра премиум-класса «Новый Горизонт», специализирующегося на:

 
  • Подготовке к международным экзаменам: IELTS, TOEFL, Cambridge (FCE/CAE/CPE), SAT, GMAT, GRE
  • Индивидуальных и мини-групповых занятиях (до 4 человек)
  • Онлайн- и офлайн-форматах с поддержкой записи и повторного просмотра уроков
  • Адаптивной программе обучения: диагностика → индивидуальный план → модули → промежуточные тесты → пробные экзамены
  • Учёте преподавателей с сертификатами (Cambridge CELTA/DELTA, ETS-certified, GMAT Club verified)
  • Системе прогресса: баллы за домашние задания, посещаемость, результаты тестов, личный рейтинг
  • Программе лояльности: 1 ₽ = 1 балл → 500 баллов = 1 бесплатный пробный экзамен (IELTS/SAT/GMAT)
  • Интеграции с внешними платформами: Zoom (логи уроков), Moodle (материалы), Cambridge English Write & Improve (оценка эссе)
 

Система должна поддерживать:

 
  • Учёт учеников: возраст, уровень языка (CEFR), целевой экзамен, дедлайн, текущий статус (активный/приостановлен/выпущен)
  • Учёт преподавателей с несколькими сертификатами и специализациями (лексика, письмо, speaking, math, critical reasoning)
  • Планирование занятий: привязка к ученику/группе, преподавателю, аудитории или онлайн-ссылке
  • Детальную историю обучения: модуль → тема → занятие → материалы → домашнее задание → проверка
  • Учёт учебных материалов: PDF, видео, интерактивные задания, ссылки на внешние ресурсы
  • Генерацию отчётов: прогресс по навыкам (Listening/Speaking/Reading/Writing), динамика баллов, прогноз экзаменационного результата
  • Систему напоминаний: дедлайны, пробные экзамены, оплата абонемента
 

 

🧩 Схема БД (уточнённая)

 
Таблица
Поля
Примечания
student
student_id (PK), full_name, birth_date, phone, email, cefr_level, target_exam, target_score, deadline_date, status, loyalty_points (INT DEFAULT 0)
status: ‘активный’, ‘приостановлен’, ‘выпущен’, ‘отчислен’
teacher
teacher_id (PK), full_name, email, hire_date, hourly_rate
Связь с сертификатами — M:N
certificate
cert_id (PK), name, issuing_org, valid_from, valid_to, document_url
‘CELTA’, ‘DELTA’, ‘ETS-Certified TOEFL Instructor’, ‘GMAT Club Verified’
teacher_certificate
teacher_id (FK), cert_id (FK)
Многие-ко-многим
specialty
specialty_id (PK), name, description
‘IELTS Writing’, ‘SAT Math’, ‘GMAT Critical Reasoning’, ‘Cambridge Speaking’
teacher_specialty
teacher_id (FK), specialty_id (FK)
course
course_id (PK), name, target_exam, cefr_from, cefr_to, duration_weeks, description
‘IELTS Intensive (B2→C1)’, ‘GMAT Full Prep’, ‘SAT Math Bootcamp’
module
module_id (PK), course_id (FK), title, order_num, description
‘Writing Task 2: Opinion Essays’, ‘Data Sufficiency Strategies’
lesson
lesson_id (PK), module_id (FK), title, duration_min, materials_json (JSONB), homework_text, homework_deadline_days
materials_json: [{"type":"pdf","url":"..."}, {"type":"video","url":"..."}]
group
group_id (PK), course_id (FK), name, max_size, start_date, end_date, status, teacher_id (FK)
status: ‘набор’, ‘в работе’, ‘завершён’, ‘отменён’
group_student
group_id (FK), student_id (FK), joined_at, status
status: ‘активный’, ‘в отпуске’, ‘отчислен’
individual_plan
plan_id (PK), student_id (FK), created_at, target_exam, target_score, weeks_total, status, notes
Индивидуальный маршрут обучения
plan_module
plan_id (FK), module_id (FK), order_num, target_completion, status
status: ‘не начат’, ‘в работе’, ‘завершён’, ‘пропущен’
session
session_id (PK), student_id (FK NULLABLE), group_id (FK NULLABLE), teacher_id (FK), lesson_id (FK), scheduled_at, actual_start, actual_end, location, zoom_link, recording_url, status, attendance
CHECK: либо student_id, либо group_id ≠ NULL; location: ‘офлайн: ауд. 302’ или ‘онлайн’
homework_submission
submission_id (PK), session_id (FK), student_id (FK), submitted_at, file_url, teacher_comment, score, is_late
score от 0 до 100, CHECK (score BETWEEN 0 AND 100)
diagnostic_test
test_id (PK), student_id (FK), type, date_taken, raw_score, scaled_score, cefr_estimated, report_url, skills_json (JSONB)
type: ‘IELTS Mock’, ‘GMAT Diagnostic’, ‘Cambridge Placement’; skills_json: {«listening»:7.0, «writing»:6.5}
payment_method
method_id (PK), name
‘наличные’, ‘карта’, ‘онлайн’, ‘рассрочка’, ‘подарочный сертификат’
invoice
invoice_id (PK), student_id (FK), course_id (FK NULLABLE), group_id (FK NULLABLE), issue_date, due_date, total_amount, paid_amount, method_id (FK), is_final (BOOLEAN DEFAULT FALSE)
CHECK (paid_amount <= total_amount AND paid_amount >= 0)
loyalty_log
log_id (PK), student_id (FK), invoice_id (FK), points_earned, points_used, change_date, reward_desc
reward_desc: ‘оплата курса’, ‘пробный экзамен IELTS’

 

✍️ Задание

✅ DDL

Напишите PostgreSQL-совместимый SQL-скрипт, включающий:

 
  • Все таблицы выше
  • Первичные и внешние ключи (ON DELETE RESTRICT / CASCADE, где логично)
  • Ограничения:
    • email: LIKE '%@%.%'
    • cefr_level: CHECK (cefr_level IN ('A1', 'A2', 'B1', 'B2', 'C1', 'C2'))
    • target_exam: CHECK (target_exam IN ('IELTS', 'TOEFL', 'FCE', 'CAE', 'CPE', 'SAT', 'GMAT', 'GRE'))
    • scaled_score в diagnostic_test:
      • Для IELTS: BETWEEN 0 AND 9
      • Для GMAT: BETWEEN 200 AND 800
      • Для SAT: BETWEEN 400 AND 1600
        → реализовать через CHECK с CASE или разнести в разные столбцы/таблицы (по желанию — укажите подход)
    • location в session: начинается с 'офлайн:' или равен 'онлайн'
  • Используйте JSONB для materials_json, skills_json — добавьте CHECK (jsonb_typeof(...)=’array’) или jsonb_typeof(...)=’object’
  • Запрещено использовать ENUM
  • Добавьте комментарии: COMMENT ON COLUMN student.cefr_level IS 'Уровень по общеевропейской шкале';
 

💡 Подсказка по триггеру:
Создайте FUNCTION update_student_cefr() → триггер AFTER INSERT OR UPDATE ON diagnostic_test, который:

  • Анализирует skills_json и scaled_score
  • Обновляет student.cefr_level (например: IELTS ≥7.5 → C1, ≥8.5 → C2)
  • Фиксирует изменение в служебной таблице cefr_log(student_id, old_level, new_level, reason)
 
 

 

✅ DML

Вставьте по 2–3 реалистичных строки в каждую таблицу.

 

Примеры данных:

 
  • Ученики:
    Морозов Артём, 17 лет, CEFR: B2, цель: IELTS 7.5 к 2026-06-15
    Кузнецова Полина, 24 года, CEFR: C1, цель: GMAT 700 к 2025-12-01
  • Преподаватели:
    Елена Соколова — CELTA, DELTA, специализация: IELTS Writing & Speaking
    Дмитрий Петров — ETS-Certified, GMAT Club Verified, SAT Math
  • Курс и модуль:
    course: 'GMAT Full Prep (6 недель)', target_exam: 'GMAT'
    module: 'Quant: Word Problems & Data Sufficiency', order_num: 3
  • Сессия:
    scheduled_at: '2025-12-05 18:00', location: 'офлайн: ауд. 205', zoom_link: NULL, status: 'проведено'
  • Диагностика:
    type: 'IELTS Mock Test #1', date_taken: '2025-11-20', raw_score: NULL, scaled_score: 6.5, skills_json: {"listening":7.0, "reading":6.5, "writing":6.0, "speaking":6.5}
  • Домашка:
    homework_text: 'Написать эссе по теме: Some people believe that unpaid community service should be compulsory in high school. To what extent do you agree?', score: 82, is_late: false
 

🌠 Контекст (обновлённый)

Вы — главный архитектор базы данных в AstroLogix, частной космической логистической компании, которая:

 
  • Запускает малые и средние грузовые миссии на Луну (LRO, южный полюс) и Марс (Jezero Crater, Hellas Planitia);
  • Клиенты:
    • Научные лаборатории (NASA, ESA, CNSA, частные — например, Helios Labs);
    • Коммерческие поселения (LunaBase Alpha, MarsHab-2);
    • Туристические корпорации (Orion Excursions — «лунные выходные» для сверхбогатых);
  • Использует собственные многоразовые транспортные модули:
    • Hermes-1 (лёгкий, до 500 кг, Луна);
    • Odyssey-M (средний, до 2.5 т, Марс, с аэродинамическим торможением);
    • Valkyrie-C (тяжёлый, 8 т, возвращаемый модуль с термозащитой);
  • Все миссии — автономные или с минимальным дистанционным контролем (6–22 мин задержка связи);
  • Поддерживается инвентаризация грузов с учётом массы, энергопотребления, радиационной устойчивости, герметичности;
  • Обязательно:
    • Сертификация грузов по COSPAR Planetary Protection Policy (Класс IV-C для Марса!);
    • Ограничение массы по этапам: старт → ТО → орбита → посадка;
    • Криогенные системы: жидкий водород/кислород, поддержание до −253 °C;
    • Резервирование жизненно важных систем (N+2 redundancy);
  • Есть система баллов «Orbital Credit»:
    • Партнёры получают кредиты за публикации, open-source ПО, совместные миссии → обменивают на скидки или приоритет запуска;
  • Интеграции:
    • NASA Horizons API (траектории),
    • SpaceTrack.org (данные по орбитальному мусору),
    • ESA’s Moonlight (лунная навигация GNSS),
    • Mars Relay Network (марсианские ретрансляторы: MRO, TGO, Tianwen-1).
 

 

🧩 Схема БД (AstroLogix Core Schema)

 
Таблица
Поля
Примечания
mission
mission_id (PK), name, target_body, launch_window_start, launch_window_end, status, launch_pad, primary_contact_email
target_body IN ('Moon', 'Mars'); status: ‘planned’, ‘fueling’, ‘launched’, ‘en_route’, ‘landed’, ‘failed’
spacecraft
craft_id (PK), name, type, dry_mass_kg, max_payload_kg, prop_type, first_launch, reuse_count, next_maintenance_due
type IN ('Hermes-1', 'Odyssey-M', 'Valkyrie-C'); prop_type: ‘cryo_LH2_LOX’, ‘hypergolic_NTO_MMH’, ‘electric_Xenon’
payload
payload_id (PK), mission_id (FK), name, owner_org, mass_kg, power_w, volume_m3, is_hazardous, pp_class, description
pp_class: ‘I’, ‘II’, ‘III’, ‘IVa’, ‘IVb’, ‘IVc’, ‘V’ (по COSPAR); CHECK (mass_kg > 0 AND mass_kg <= 8000)
payload_requirement
payload_id (FK), req_type, value_text, value_num
req_type: ‘temp_min’, ‘temp_max’, ‘rad_tolerance_Sv’, ‘vibration_max_g’, ‘comm_band’; хранит техтребования
launch_vehicle
lv_id (PK), name, manufacturer, leo_capacity_kg, tli_capacity_kg, tmi_capacity_kg, reusable_stages
name: ‘Neptune-9’, ‘Ares Heavy’, ‘StarCore-5’
mission_craft
mission_id (FK), craft_id (FK), role
role: ‘lander’, ‘orbiter’, ‘ascender’, ‘relay’ — M:N
mission_lv
mission_id (FK), lv_id (FK)
связь миссии и РН (1 миссия = 1 РН)
trajectory
traj_id (PK), mission_id (FK), type, departure_epoch, arrival_epoch, delta_v_km_s, midcourse_corrections, hazard_zones_json (JSONB)
type: ‘Hohmann’, ‘Bi-elliptic’, ‘Low-energy transfer’, ‘Direct abort’; hazard_zones_json: [{"zone":"Van_Allen","t_start":"...", "t_end":"..."}]
ground_station
gs_id (PK), name, location, antenna_diameter_m, freq_bands, operator
location: ‘Canberra, AU’, ‘Madrid, ES’, ‘Goldstone, US’
comm_schedule
schedule_id (PK), mission_id (FK), gs_id (FK), start_utc, end_utc, data_rate_mbps, purpose
purpose: ‘telemetry’, ‘command_uplink’, ‘payload_data’, ’emergency’
anomaly_log
anomaly_id (PK), mission_id (FK), timestamp_utc, system, severity, description, resolution, is_resolved
severity: 1 (незначительный) → 5 (критический); system: ‘propulsion’, ‘power’, ‘comms’, ‘thermal’, ‘guidance’
orbital_credit
credit_id (PK), org_id (FK), earned, used, reason, timestamp
org_id ссылается на organization.org_id; reason — ‘open_data_release’, ‘joint_mission’, ‘tech_contribution’
organization
org_id (PK), name, type, country, contact_email, is_verified
type: ‘space_agency’, ‘research_lab’, ‘commercial_hab’, ‘tourism’, ‘startup’
supply_chain
item_id (PK), name, part_number, supplier_org_id (FK), mass_kg, radiation_hardened, qualification_report_url
для учёта компонентов (например, «StarTracker-XT, PN: STX-7700»)
craft_component
craft_id (FK), item_id (FK), installed_at, location_on_craft, serial_number, expected_life_cycles
M:N между КА и компонентами

 

✍️ Задание

DDL (PostgreSQL)

Напишите SQL-скрипт, включающий:

 
  • Все таблицы выше (можно опустить supply_chain и craft_component, если хочется упростить);
  • Первичные и внешние ключи с обоснованным ON DELETE (RESTRICT для миссий, CASCADE для логов и расписаний);
  • Ограничения:
    • email — валидный формат;
    • target_body, pp_class, prop_type, typemission, spacecraft, trajectory) — через CHECK;
    • mass_kg, power_w, volume_m3 > 0;
    • hazard_zones_jsonjsonb_typeof = 'array', и каждый элемент — объект с zone, t_start, t_end (используйте jsonb_path_exists);
    • delta_v_km_s BETWEEN 0 AND 25;
    • severity в anomaly_log: BETWEEN 1 AND 5;
  • Комментарии ко всем колонкам (на русском или английском — по желанию);
  • Триггер:
    Создайте FUNCTION check_mass_budget()BEFORE INSERT OR UPDATE ON payload, который:

    • Считает общую массу всех payload в миссии;
    • Сравнивает с max_payload_kg соответствующего spacecraft (через mission_craft);
    • Если превышение — RAISE EXCEPTION 'Payload mass exceeds spacecraft capacity!';
    • Дополнительно: логировать попытки в mass_violation_log(mission_id, attempted_mass, allowed_mass, timestamp).
 

DML

Вставьте реалистичные данные (2–3 строки на таблицу), например:

 
  • Миссия: «Luna-Resupply-7», запуск: 2026-Q1, цель: LunaBase Alpha, груз — кислородные картриджи + модуль 3D-печати реголита;
  • КА: Hermes-1 «Arachne», reuse_count = 4, с компонентами: «RadiationShield-Mk3», «NavStar-S2 GNSS receiver»;
  • Груз: «Regolith Sintering Printer v2.1», pp_class = 'III', mass_kg = 320, temp_max = 85;
  • Аномалия: severity = 3, system = 'thermal', description = 'Coolant loop pressure drop in lander leg #2';
  • Организация: Helios Labs (research_lab, USA), получила 1500 Orbital Credits за open-source ПО «TrajSim-Core».

Сделать БД по ER-диаграмме:

(Прямая ссылка)

Сделать ER диаграмму по шаблону:

Делать тутPicture background

Потом по этой ER диаграмме написать код БД.

🌠 Контекст (обновлённый)

Вы — главный архитектор базы данных в Stellar Dynamics, частной компании по орбитальному сервису и удалению космического мусора, которая:

  • Специализация: обслуживание, дозаправка, ремонт и утилизация спутников на всех орбитах (LEO, MEO, GEO, HEO);

  • Клиенты:

    • Спутниковые операторы (Starlink, OneWeb, Iridium);

    • Государственные агентства (Роскосмос, ISRO, JAXA);

    • Коммерческие компании (Planet Labs, Maxar);

    • Страховые компании (Lloyd’s of London — оценка рисков);

  • Использует собственные сервисные аппараты:

    • Orbital-Tug Mk.I (легкий, до 500 кг полезной нагрузки, LEO/MEO);

    • GeoServant (средний, до 2 т, GEO/HEO, с манипуляторами);

    • DebrisCollector (тяжелый, 5 т, сбор мусора с сетями и гарпунами);

  • Все операции — автономные с поддержкой AI-планировщика (задержка связи до 5 секунд для LEO);

  • Ведётся реестр объектов с учётом массы, баллистического коэффициента, класса опасности, орбитальных параметров;

  • Обязательно:

    • Сертификация по ISO 24113 (орбитальное пространство);

    • Расчёт вероятности столкновения (Pc) по алгоритму CARA/ODQN;

    • Система раннего предупреждения о сближениях (<1 км);

    • Резервирование систем управления (N+3 redundancy);

  • Есть система рейтинга «Orbital Stewardship Points»:

    • Операторы получают баллы за своевременное уведомление о манёврах, передачу телеметрии, утилизацию аппаратов → скидки на услуги;

  • Интеграции:

    • Space-Track.org API (TLE, CDM);

    • ESA’s DRAMA/MASTER (модель мусора);

    • NASA’s CARA (оценка рисков);

    • Satellite Catalog (SATCAT);

    • AGI’s STK (расчёты);

🧩 Схема БД (Stellar Dynamics Core Schema)

 
 
ТаблицаПоляПримечания
service_missionmission_id (PK), name, mission_type, orbit_type, start_window, end_window, status, priority, customer_contactmission_type: ‘refueling’, ‘repair’, ‘relocation’, ‘deorbiting’, ‘debris_removal’; orbit_type: ‘LEO’, ‘MEO’, ‘GEO’, ‘HEO’, ‘SSO’
servicer_spacecraftcraft_id (PK), name, model, dry_mass_kg, max_fuel_kg, max_payload_kg, propulsion_type, first_launch, missions_completedmodel: ‘Orbital-Tug Mk.I’, ‘GeoServant’, ‘DebrisCollector’; propulsion_type: ‘electric’, ‘chemical’, ‘hybrid’
target_objectobject_id (PK), norad_id, name, owner_org, object_type, mass_kg, cross_section_m2, ballistic_coeff, orbit_apogee_km, orbit_perigee_km, inclination_degobject_type: ‘active_satellite’, ‘defunct_satellite’, ‘debris’, ‘rocket_body’, ‘unknown’
mission_targetmission_id (FK), object_id (FK), role, distance_m, relative_velocity_m_srole: ‘primary_target’, ‘secondary_target’, ‘debris_cloud’; M:N связь
mission_servicermission_id (FK), craft_id (FK), rolerole: ‘primary_servicer’, ‘backup’, ‘observer’
collision_riskrisk_id (PK), mission_id (FK), object_id (FK), time_of_closest_approach, miss_distance_m, probability, risk_level, evasive_maneuver_plannedprobability BETWEEN 0 AND 1; risk_level: ‘low’, ‘medium’, ‘high’, ‘critical’
fuel_loglog_id (PK), craft_id (FK), mission_id (FK), timestamp, fuel_type, amount_kg, remaining_kg, purposefuel_type: ‘hydrazine’, ‘xenon’, ‘kerosene_LOX’; purpose: ‘transfer’, ‘station_keeping’, ‘deorbit’
maneuver_planmaneuver_id (PK), mission_id (FK), sequence_number, delta_v_m_s, start_time, end_time, fuel_estimated_kg, maneuver_typemaneuver_type: ‘phasing’, ‘rendezvous’, ‘collision_avoidance’, ‘deorbit_burn’
telemetrytelemetry_id (PK), craft_id (FK), timestamp, battery_voltage, temperature_c, propellant_pressure_bar, attitude_quaternion_json (JSONB)attitude_quaternion_json: {«q0»: 0.707, «q1»: 0, «q2»: 0, «q3»: 0.707}
ground_segmentstation_id (PK), name, location, antenna_type, freq_range_ghz, max_data_rate_mbps, operatorlocation: ‘Baikonur, KZ’, ‘Kourou, GF’, ‘Cape Canaveral, US’
communication_sessionsession_id (PK), mission_id (FK), station_id (FK), start_utc, end_utc, data_volume_gb, signal_strength_db, protocolprotocol: ‘CCSDS’, ‘TCP/IP over SCPS’, ‘proprietary’
anomaly_reportreport_id (PK), mission_id (FK), craft_id (FK), timestamp, subsystem, severity, description, corrective_action, resolvedseverity: 1-5 (1=minor, 5=catastrophic); subsystem: ‘propulsion’, ‘power’, ‘thermal’, ‘navigation’, ‘comm’
stewardship_pointspoints_id (PK), org_id (FK), points_earned, points_used, reason, award_dateorg_id ссылается на space_organization.org_id
space_organizationorg_id (PK), name, org_type, country, registration_number, contact_emailorg_type: ‘commercial’, ‘government’, ‘research’, ‘military’
component_inventorycomponent_id (PK), name, part_number, manufacturer, mass_kg, radiation_tolerance_krad, operating_temp_rangeдля запчастей и инструментов
craft_componentcraft_id (FK), component_id (FK), installed_date, expected_life_hours, maintenance_due_dateM:N между аппаратом и компонентами

✍️ Задание

✅ DDL (PostgreSQL)

Напишите SQL-скрипт, включающий:

  1. Все таблицы выше (можно опустить component_inventory и craft_component, если хотите упростить);

  2. Первичные и внешние ключи с обоснованным ON DELETE:

    • RESTRICT для mission_target и mission_servicer;

    • CASCADE для anomaly_report и fuel_log;

  3. Ограничения:

    • contact_email — валидный формат (REGEXP);

    • mission_typeorbit_typeobject_typepropulsion_type — через CHECK;

    • mass_kgmax_fuel_kgcross_section_m2 > 0;

    • attitude_quaternion_json — jsonb_typeof = 'object', должен содержать поля q0, q1, q2, q3 с значениями от -1 до 1;

    • probability в collision_riskBETWEEN 0 AND 1;

    • severity в anomaly_reportBETWEEN 1 AND 5;

    • miss_distance_m > 0;

  4. Комментарии ко всем колонкам (на русском или английском — по желанию);

  5. ✨ Триггер:
    Создайте FUNCTION check_fuel_capacity() → BEFORE INSERT OR UPDATE ON fuel_log, который:

    • Проверяет, не превышает ли amount_kg доступную ёмкость баков (max_fuel_kg) сервисного аппарата;

    • Если remaining_kg после заправки превышает max_fuel_kg → RAISE EXCEPTION 'Fuel capacity exceeded!';

    • Дополнительно: логировать попытки в fuel_violation_log(craft_id, attempted_amount, max_capacity, timestamp).

✅ DML

Вставьте реалистичные данные (2–3 строки на таблицу), например:

  1. Миссия: «Starlink-3015 Refuel», mission_type=’refueling’, orbit_type=’LEO’, priority=’high’;

  2. Сервисный аппарат: GeoServant «Athena», model=’GeoServant’, max_fuel_kg=1200, propulsion_type=’electric’;

  3. Целевой объект: NORAD 25544 (Starlink-3015), object_type=’active_satellite’, mass_kg=260;

  4. Риск столкновения: probability=0.003, miss_distance_m=850, risk_level=’medium’;

  5. Заправка: fuel_type=’xenon’, amount_kg=45, purpose=’rendezvous maneuvers’;

  6. Аномалия: severity=2, subsystem=’thermal’, description=’Radiator surface temperature 5°C above nominal’;

  7. Организация: SpaceX (commercial, USA), получила 5000 Stewardship Points за своевременное уведомление о манёвре.