Сформулируйте задачу проектирования нормализованной схемы базы данных для системы управления университетом (студенты, курсы, преподаватели, оценки, расписание), укажите нормальные формы, возможные денормализации для производительности и последствия каждого решения

24 Ноя в 09:34
2 +2
0
Ответы
1
Задача проектирования (кратко)
- Построить нормализованную реляционную схему для системы управления университетом, покрывающую: студенты, преподаватели, кафедры, курсы, предложения курсов (секции), расписание (аудитории/времена), зачисления, оценки, преподы-адвайзеры, предусловия курсов.
- Требования: целостность данных (PK, FK), отсутствие аномалий обновления, поддержка типичных операций: регистрация/отчисление, проставление оценок, расписание/поиск занятий, вычисление GPA, отчёты и агрегаты.
- Поддержать масштабирование чтения (отчёты) и записи (регистрация, выставление оценок).
Нормализованная схема (предлагаемые таблицы, PK/FK)
- Students(student_id PK, first_name, last_name, dob, email, enrollment_year, major_dept_id FK)Students(student\_id\;PK,\;first\_name,\;last\_name,\;dob,\;email,\;enrollment\_year,\;major\_dept\_id\;FK)Students(student_idPK,first_name,last_name,dob,email,enrollment_year,major_dept_idFK)
- Professors(professor_id PK, first_name, last_name, email, dept_id FK, title)Professors(professor\_id\;PK,\;first\_name,\;last\_name,\;email,\;dept\_id\;FK,\;title)Professors(professor_idPK,first_name,last_name,email,dept_idFK,title)
- Departments(dept_id PK, name, chair_professor_id FK)Departments(dept\_id\;PK,\;name,\;chair\_professor\_id\;FK)Departments(dept_idPK,name,chair_professor_idFK)
- Courses(course_id PK, course_code, title, credits, dept_id FK)Courses(course\_id\;PK,\;course\_code,\;title,\;credits,\;dept\_id\;FK)Courses(course_idPK,course_code,title,credits,dept_idFK)
- Sections(section_id PK, course_id FK, term, year, section_num, professor_id FK, capacity)Sections(section\_id\;PK,\;course\_id\;FK,\;term,\;year,\;section\_num,\;professor\_id\;FK,\;capacity)Sections(section_idPK,course_idFK,term,year,section_num,professor_idFK,capacity) (уникальность: (course_id,term,year,section_num)(course\_id,term,year,section\_num)(course_id,term,year,section_num))
- TimeSlots(timeslot_id PK, day_of_week, start_time, end_time)TimeSlots(timeslot\_id\;PK,\;day\_of\_week,\;start\_time,\;end\_time)TimeSlots(timeslot_idPK,day_of_week,start_time,end_time)
- Rooms(room_id PK, building, room_number, capacity)Rooms(room\_id\;PK,\;building,\;room\_number,\;capacity)Rooms(room_idPK,building,room_number,capacity)
- Schedules(section_id FK, timeslot_id FK, room_id FK, PRIMARY KEY(section_id,timeslot_id,room_id))Schedules(section\_id\;FK,\;timeslot\_id\;FK,\;room\_id\;FK,\;PRIMARY\;KEY(section\_id,timeslot\_id,room\_id))Schedules(section_idFK,timeslot_idFK,room_idFK,PRIMARYKEY(section_id,timeslot_id,room_id)) (поддерживает несколько временных слотов)
- Enrollments(enrollment_id PK, student_id FK, section_id FK, enroll_date, status)Enrollments(enrollment\_id\;PK,\;student\_id\;FK,\;section\_id\;FK,\;enroll\_date,\;status)Enrollments(enrollment_idPK,student_idFK,section_idFK,enroll_date,status) (альтернатива: PK = (student_id,section_id)(student\_id,section\_id)(student_id,section_id))
- Grades(grade_id PK, enrollment_id FK, grade, grade_date, graded_by_professor_id FK)Grades(grade\_id\;PK,\;enrollment\_id\;FK,\;grade,\;grade\_date,\;graded\_by\_professor\_id\;FK)Grades(grade_idPK,enrollment_idFK,grade,grade_date,graded_by_professor_idFK) (для истории/пересдач)
- Prerequisites(course_id FK, prereq_course_id FK, PRIMARY KEY(course_id,prereq_course_id))Prerequisites(course\_id\;FK,\;prereq\_course\_id\;FK,\;PRIMARY\;KEY(course\_id,prereq\_course\_id))Prerequisites(course_idFK,prereq_course_idFK,PRIMARYKEY(course_id,prereq_course_id))
- Advisors(student_id FK, professor_id FK, PRIMARY KEY(student_id,professor_id))Advisors(student\_id\;FK,\;professor\_id\;FK,\;PRIMARY\;KEY(student\_id,professor\_id))Advisors(student_idFK,professor_idFK,PRIMARYKEY(student_id,professor_id))
Функциональные зависимости и нормальные формы
- Общая идея: все таблицы проектируются так, чтобы нетривиальные функциональные зависимости имели в качестве левой части суперключ — цель: как минимум 3NF\text{3NF}3NF, где нужно — BCNF\text{BCNF}BCNF.
- Примеры:
- Students: student_id→first_name,last_name,dob,email,enrollment_year,major_dept_idStudents:\;student\_id \rightarrow first\_name,last\_name,dob,email,enrollment\_year,major\_dept\_idStudents:student_idfirst_name,last_name,dob,email,enrollment_year,major_dept_id. PK — student_idstudent\_idstudent_id. Нет частичных или транзитивных зависимостей → таблица в BCNF\text{BCNF}BCNF.
- Courses: course_id→course_code,title,credits,dept_idCourses:\;course\_id \rightarrow course\_code,title,credits,dept\_idCourses:course_idcourse_code,title,credits,dept_id. PK — course_idcourse\_idcourse_id. Если существует правило «course\_code уникален в факультете», нужно учесть ограничение уникальности; в типичной модели — таблица в BCNF\text{BCNF}BCNF либо 3NF\text{3NF}3NF.
- Sections: section_id→course_id,term,year,section_num,professor_id,capacitySections:\;section\_id \rightarrow course\_id,term,year,section\_num,professor\_id,capacitySections:section_idcourse_id,term,year,section_num,professor_id,capacity. Если PK = section_idsection\_idsection_id — таблица в BCNF\text{BCNF}BCNF. Если PK составной (course_id,term,year,section_num)(course\_id,term,year,section\_num)(course_id,term,year,section_num) — убедиться в отсутствии частичных зависимостей (переместить атрибуты при необходимости).
- Enrollments:Enrollments:Enrollments: если PK = enrollment_idenrollment\_idenrollment_id (или (student_id,section_id)(student\_id,section\_id)(student_id,section_id)), то зависимость PK → остальные атрибуты → 3NF\text{3NF}3NF/BCNF\text{BCNF}BCNF при отсутствии транзитивных зависимостей.
- Grades:Grades:Grades: отдельная таблица для истории оценок устраняет повторные значения в Enrollments и даёт 3NF\text{3NF}3NF.
Рекомендация: базовая схема держать в 3NF\text{3NF}3NF или BCNF\text{BCNF}BCNF (при простых ключах чаще BCNF\text{BCNF}BCNF), чтобы исключить аномалии вставки/обновления/удаления.
Возможные денормализации для повышения производительности и последствия
1) Кешированный/вычисляемый GPA в Students
- Как: добавить колонку gpagpagpa в StudentsStudentsStudents и обновлять её при изменении оценок (триггером или фоновой задачей).
- Выгода: быстрые запросы и сортировка по GPA (панели, подбор стипендий).
- Издержки: сложность поддержания согласованности (требуются транзакции/триггеры или периодические перерасчёты), риск рассинхронизации (сталеющие данные), небольшой расход хранения.
- Мягкая альтернатива: материализованный вид с периодическим рефрешем.
2) Дублирование имени преподавателя/названия курса в Sections/Enrollments
- Как: хранить professor_nameprofessor\_nameprofessor_name в SectionsSectionsSections или course_titlecourse\_titlecourse_title в SectionsSectionsSections.
- Выгода: меньше JOIN-ов при выдаче расписания/списков — ускорение чтения.
- Издержки: при изменении имени/названия нужно обновлять все копии → возможные аномалии обновления; увеличенный размер записей; нужно обеспечивать каскадные обновления или фоновые процессы.
3) Помещение оценки прямо в Enrollments (убрать отдельную таблицу Grades)
- Как: добавить grade,grade_dategrade, grade\_dategrade,grade_date в EnrollmentsEnrollmentsEnrollments.
- Выгода: упрощение запросов для текущей оценки, меньше JOIN-ов.
- Издержки: теряется история экзаменов/пересдач; если нужна история, приходится хранить её отдельно или резервировать структуру.
4) Флаттенинг расписания (одна колонка со строкой со всеми timeslot/room)
- Как: поле schedule_textschedule\_textschedule_text в SectionsSectionsSections со всеми данными расписания (CSV/JSON).
- Выгода: мгновенное чтение и простота отображения.
- Издержки: потеря структурных возможностей (поиск по времени, индексация), нарушение 1NF\text{1NF}1NF при массивных полях, сложные обновления отдельных слотов, индексирование по содержимому ограничено (если не использовать специализированные типы/индексы).
5) Материализованные представления/агрегаты (например, число зачисленных в секцию, средний балл по курсу)
- Как: предвычислять и хранить enrollment_countenrollment\_countenrollment_count в Sections или в отдельной таблице-агрегате.
- Выгода: очень быстрые отчёты и панельные метрики.
- Издержки: ресурсы на поддержание (триггеры/планировщик), возможная рассинхронизация; при интенсивных обновлениях — дополнительные блокировки и накладные расходы.
6) Репликация и шардинг
- Как: реплика чтения (read replicas) или шардинг по факультету/году.
- Выгода: масштабирование чтений, разделение нагрузки.
- Издержки: сложность конфигурации, задержка репликации, необходимость маршрутизации запросов; при шардинге сложнее выполнять глобальные транзакции/агрегации.
Последствия денормализаций (общие)
- Плюсы: уменьшение числа JOIN-ов, снижение задержки чтения, ускорение отчётов, простота некоторых запросов.
- Минусы: увеличение места хранения, сложность поддержания согласованности, риск аномалий при обновлении (необходимо проектировать транзакции/триггеры или фоновые процессы), сложнее обеспечение целостности данных и откатов, усложнение логики приложения/миграций.
- Компромисс: проводить точечную денормализацию для горячих путей (hot paths): профилирование, тесты нагрузки, автоматическое поддержание консистентности (триггеры/события) или eventual consistency с явной стратегией обновления.
Рекомендации
- Базовую модель держать в 3NF\text{3NF}3NF/BCNF\text{BCNF}BCNF.
- Оптимизации: индексы по часто фильтруемым колонкам (student\_id, section\_id, term, year), материализованные представления для тяжёлых агрегатов, read-replicas для отчётов.
- Денормализовать только под обоснованные кейсы на основе метрик (latency, QPS) и сопровождать чёткой стратегией синхронизации (триггеры, транзакции, фоновые перерасчёты).
Если нужно — могу дать компактную диаграмму зависимостей и пример SQL DDL для предложенной схемы.
24 Ноя в 10:26
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир