Пример https://www.schoolsw3.com/sql/sql_insert.php
ALTER TABLE enrollments
ADD CONSTRAINT enrollments_student_id_fk
FOREIGN KEY (student_id) REFERENCES students(id)
ON DELETE CASCADE;
Освоить проектирование реляционной базы данных и написание 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.✍️ Задание
Напишите DDL-скрипт: создайте все 5 таблиц с корректными:
PRIMARY KEY) и внешними ключами (FOREIGN KEY),VARCHAR, DATE, INT, BOOLEAN и др.),NOT NULL, CHECK, DEFAULT).Например:
CHECK (role IN ('студент', 'преподаватель')),DEFAULT CURRENT_DATEдляenroll_date.
Вставьте по 2–3 тестовые записи в каждую таблицу (DML: INSERT).
(Дополнительно) Напишите один из запросов:
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 = 'кардиология' |
🔹 Связи:
PRIMARY KEY и FOREIGN KEY,VARCHAR, TIMESTAMP, TIME, INT, ENUM/CHECK),NOT NULL, CHECK, DEFAULT).INSERT).Пациент | Врач | Специализация | Дата приёма | Статус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), но счёт создаётся только после завершения приёма.Напишите 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).Выполните:
INSERT в каждую таблицу (реалистичные данные: ФИО, даты, цены).patient_name | dentist_name | procedure_name | app_date | paid_statusspecialty в отдельную таблицу? Почему?invoice) создаётся только для завершённого приёма? (Подсказка: триггеры или прикладная логика?)treatment_log, если base_price может со временем меняться?Вам поручено спроектировать реляционную базу данных для частной комплексной стоматологической клиники «ДентАрт», специализирующейся на цифровой диагностике, эстетике и протезировании. Система должна поддерживать:
Таблица | Поля | Примечания |
|---|---|---|
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), с возможностью списания при следующем визите.Напишите 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)
Иванова Анна Сергеевна, Дроздов Артём Олегович'Цифровой оттиск челюсти (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_amountb) Топ-3 самых прибыльных процедур за квартал (по сумме paid_amount):
Вам поручено спроектировать реляционную базу данных для частного автомобильного сервисного центра премиум-класса «Авто-Элит», специализирующегося на:
Система должна поддерживать:
Таблица | Поля | Примечания |
|---|---|---|
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 |
Напишите PostgreSQL-совместимый SQL-скрипт, включающий:
ON DELETE RESTRICT, ON UPDATE CASCADE, где уместно)NOT NULL, DEFAULT, CHECK-ограничения:vin: длина 17, только буквы/цифры, исключая I/O/Qemail: базовая проверка через LIKE '%@%.%'paid_amount ≤ total_amounttooth_code → заменяется на part_code: допустимы цифры, буквы, символы '-', '_', '.'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) при создании счёта (это можно учесть в логике приложения или через второй триггер/функцию).
Вставьте по 2–3 реалистичных строки в каждую таблицу.
Примеры реалистичных данных:
VIN: WDD1770421J123456, brand: Mercedes-Benz, model: E300, year: 2022, license_plate: А123ВС77, is_ev: falseVIN: 5YJ3E1EA9MF123789, brand: Tesla, model: Model Y, year: 2023, license_plate: Т999ОК777, is_ev: truediag_report_url: '["https://autocloud.ru/diag/WDD177_20241201.json", "https://autocloud.ru/diag/WDD177_dtc.pdf"]'work_type:'Полная диагностика ходовой (3D-развал/схождение)''Замена охлаждающей жидкости инвертора (Tesla)''Компьютерная полировка кузова (3 этапа)'parent_order_id: укажите, если заказ — продолжение (например, диагностика → замена амортизаторов)Вам поручено спроектировать реляционную базу данных для частного образовательного центра премиум-класса «Новый Горизонт», специализирующегося на:
Система должна поддерживать:
Таблица | Поля | Примечания |
|---|---|---|
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’ |
Напишите 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:BETWEEN 0 AND 9BETWEEN 200 AND 800BETWEEN 400 AND 1600CHECK с CASE или разнести в разные столбцы/таблицы (по желанию — укажите подход)location в session: начинается с 'офлайн:' или равен 'онлайн'JSONB для materials_json, skills_json — добавьте CHECK (jsonb_typeof(...)=’array’) или jsonb_typeof(...)=’object’ENUMCOMMENT 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)
Вставьте по 2–3 реалистичных строки в каждую таблицу.
Примеры данных:
course: 'GMAT Full Prep (6 недель)', target_exam: 'GMAT'module: 'Quant: Word Problems & Data Sufficiency', order_num: 3scheduled_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, частной космической логистической компании, которая:
Таблица | Поля | Примечания |
|---|---|---|
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 между КА и компонентами |
Напишите SQL-скрипт, включающий:
supply_chain и craft_component, если хочется упростить);ON DELETE (RESTRICT для миссий, CASCADE для логов и расписаний);email — валидный формат;target_body, pp_class, prop_type, type (в mission, spacecraft, trajectory) — через CHECK;mass_kg, power_w, volume_m3 > 0;hazard_zones_json — jsonb_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).Вставьте реалистичные данные (2–3 строки на таблицу), например:
pp_class = 'III', mass_kg = 320, temp_max = 85;severity = 3, system = 'thermal', description = 'Coolant loop pressure drop in lander leg #2';Вы — главный архитектор базы данных в 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 (расчёты);
| Таблица | Поля | Примечания |
|---|---|---|
| service_mission | mission_id (PK), name, mission_type, orbit_type, start_window, end_window, status, priority, customer_contact | mission_type: ‘refueling’, ‘repair’, ‘relocation’, ‘deorbiting’, ‘debris_removal’; orbit_type: ‘LEO’, ‘MEO’, ‘GEO’, ‘HEO’, ‘SSO’ |
| servicer_spacecraft | craft_id (PK), name, model, dry_mass_kg, max_fuel_kg, max_payload_kg, propulsion_type, first_launch, missions_completed | model: ‘Orbital-Tug Mk.I’, ‘GeoServant’, ‘DebrisCollector’; propulsion_type: ‘electric’, ‘chemical’, ‘hybrid’ |
| target_object | object_id (PK), norad_id, name, owner_org, object_type, mass_kg, cross_section_m2, ballistic_coeff, orbit_apogee_km, orbit_perigee_km, inclination_deg | object_type: ‘active_satellite’, ‘defunct_satellite’, ‘debris’, ‘rocket_body’, ‘unknown’ |
| mission_target | mission_id (FK), object_id (FK), role, distance_m, relative_velocity_m_s | role: ‘primary_target’, ‘secondary_target’, ‘debris_cloud’; M:N связь |
| mission_servicer | mission_id (FK), craft_id (FK), role | role: ‘primary_servicer’, ‘backup’, ‘observer’ |
| collision_risk | risk_id (PK), mission_id (FK), object_id (FK), time_of_closest_approach, miss_distance_m, probability, risk_level, evasive_maneuver_planned | probability BETWEEN 0 AND 1; risk_level: ‘low’, ‘medium’, ‘high’, ‘critical’ |
| fuel_log | log_id (PK), craft_id (FK), mission_id (FK), timestamp, fuel_type, amount_kg, remaining_kg, purpose | fuel_type: ‘hydrazine’, ‘xenon’, ‘kerosene_LOX’; purpose: ‘transfer’, ‘station_keeping’, ‘deorbit’ |
| maneuver_plan | maneuver_id (PK), mission_id (FK), sequence_number, delta_v_m_s, start_time, end_time, fuel_estimated_kg, maneuver_type | maneuver_type: ‘phasing’, ‘rendezvous’, ‘collision_avoidance’, ‘deorbit_burn’ |
| telemetry | telemetry_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_segment | station_id (PK), name, location, antenna_type, freq_range_ghz, max_data_rate_mbps, operator | location: ‘Baikonur, KZ’, ‘Kourou, GF’, ‘Cape Canaveral, US’ |
| communication_session | session_id (PK), mission_id (FK), station_id (FK), start_utc, end_utc, data_volume_gb, signal_strength_db, protocol | protocol: ‘CCSDS’, ‘TCP/IP over SCPS’, ‘proprietary’ |
| anomaly_report | report_id (PK), mission_id (FK), craft_id (FK), timestamp, subsystem, severity, description, corrective_action, resolved | severity: 1-5 (1=minor, 5=catastrophic); subsystem: ‘propulsion’, ‘power’, ‘thermal’, ‘navigation’, ‘comm’ |
| stewardship_points | points_id (PK), org_id (FK), points_earned, points_used, reason, award_date | org_id ссылается на space_organization.org_id |
| space_organization | org_id (PK), name, org_type, country, registration_number, contact_email | org_type: ‘commercial’, ‘government’, ‘research’, ‘military’ |
| component_inventory | component_id (PK), name, part_number, manufacturer, mass_kg, radiation_tolerance_krad, operating_temp_range | для запчастей и инструментов |
| craft_component | craft_id (FK), component_id (FK), installed_date, expected_life_hours, maintenance_due_date | M:N между аппаратом и компонентами |
Напишите SQL-скрипт, включающий:
Все таблицы выше (можно опустить component_inventory и craft_component, если хотите упростить);
Первичные и внешние ключи с обоснованным ON DELETE:
RESTRICT для mission_target и mission_servicer;
CASCADE для anomaly_report и fuel_log;
Ограничения:
contact_email — валидный формат (REGEXP);
mission_type, orbit_type, object_type, propulsion_type — через CHECK;
mass_kg, max_fuel_kg, cross_section_m2 > 0;
attitude_quaternion_json — jsonb_typeof = 'object', должен содержать поля q0, q1, q2, q3 с значениями от -1 до 1;
probability в collision_risk: BETWEEN 0 AND 1;
severity в anomaly_report: BETWEEN 1 AND 5;
miss_distance_m > 0;
Комментарии ко всем колонкам (на русском или английском — по желанию);
✨ Триггер:
Создайте 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).
Вставьте реалистичные данные (2–3 строки на таблицу), например:
Миссия: «Starlink-3015 Refuel», mission_type=’refueling’, orbit_type=’LEO’, priority=’high’;
Сервисный аппарат: GeoServant «Athena», model=’GeoServant’, max_fuel_kg=1200, propulsion_type=’electric’;
Целевой объект: NORAD 25544 (Starlink-3015), object_type=’active_satellite’, mass_kg=260;
Риск столкновения: probability=0.003, miss_distance_m=850, risk_level=’medium’;
Заправка: fuel_type=’xenon’, amount_kg=45, purpose=’rendezvous maneuvers’;
Аномалия: severity=2, subsystem=’thermal’, description=’Radiator surface temperature 5°C above nominal’;
Организация: SpaceX (commercial, USA), получила 5000 Stewardship Points за своевременное уведомление о манёвре.
© 1967 - 2026 ГАПОУ "Перевозский строительный колледж". Все права защищены