Проектные предложения для учителей, предметы и база данных классов

Как часть задачи проектирования базы данных для средней школы, я как бы застрял с таблицей классов. Таблицы, созданные на данный момент:

Students
--------------
Id
name

Grades (grade 1,2,....9,10)
------------------
id    
description    
term

Subjects (science,maths...)
-------------------
id
name

grade_subject (subjects tought in grades)
----------------
id
grade_id
subject_id

teacher
---------------------
id
name

teacher_subject (teachers who are assigned to teach subjects in particular grade)
---------------------
id
teacher_id
grade_subject_id

Я не уверен в дизайне таблицы таблицы teacher_subject. Эта таблица использует идентификатор grade_subject_id, который может (не) быть хорошим дизайном. Должны ли в этой таблице два FK, один grade_id и subject_id?

Кроме того, мне также необходимо хранить количество уроков, проводимых по конкретному предмету и классу конкретным назначенным учителем.

Подойдет ли эта таблица в этом случае:

Class (stores daily teaching schedule)
-----------------------------------
id
*teacher_id
grade_id
subject_id*

*or only teacher_subject_id from teacher_subject table*

date
start_time
end_time
status ( conducted/cancelled/postponed)+

И, наконец, таблица для хранения информации о том, кто посещал занятия

attandants
--------------------
student_id
class_id

Любые предложения будут с благодарностью.

2 ответа

Решение

Моделирование данных - это искусство представления реального мира в диаграмме отношений. Ваш режим правильный, но так ли это?

Считайте, что такое КЛАСС? Это УЧИТЕЛЬ, ПРЕДМЕТ и СОРТ. Это ваши отношения. Кроме того, вы хотите обеспечить соблюдение правил, которые ПРЕДМЕТ подходит для этой СОРТЫ и чтобы УЧИТЕЛЬ мог обучать этому СУБЪЕКТУ в этой СОРТЕ.

Я думаю, что ваша проблема заключается в использовании суррогатных ключей в таблицах пересечений. Это таблицы, которые представляют ваши отношения "многие ко многим": teacher_subject, grade_subject, В любом случае это синтетические таблицы, и в любом случае они состоят только из ключей. Следовательно, достаточно составного первичного ключа.

Суррогатные первичные ключи не имеют смысла, поэтому нам нужно определить уникальное ограничение для grade_subject(subject_id, grade_id) чтобы убедиться, что у нас нет двух записей для ('PHYSICS', 'YEAR 2'). При условии grade_subject таблица пересечений без других столбцов, добавление суррогатного ключа не имеет смысла. Ценность суррогатных ключей заключается в том, чтобы минимизировать влияние изменения бизнес-ключа. Но grade_subject не имеет бизнес-ключа, только два суррогатных ключа, subject_id а также grade_id,

Это имеет преимущество, когда дело доходит до определения ссылочной целостности.

Поэтому я бы подошел к вашей проблеме следующим образом:

grade_subject 
----------------
grade_id
subject_id
primary key (grade_id, subject_id)
foreign key (grade_id) reference grade (grade_id) 
foreign key (subject_id) reference subject (subject_id) 

teacher_subject 
---------------------
teacher_id
grade_id
subject_id
primary key (teacher_id,grade_id, subject_id)
foreign key (grade_id) reference grade (grade_id) 
foreign key (subject_id) reference subject (subject_id) 
foreign key (teacher_id) reference teacher (teacher_id) 
foreign key (grade_id,subject_id) reference grade_subject (grade_id,subject_id) 

Class 
-----------------------------------
id
teacher_id
grade_id
subject_id
primary key (id)
foreign key (grade_id) reference grade (grade_id) 
foreign key (subject_id) reference subject (subject_id) 
foreign key (teacher_id) reference teacher (teacher_id) 
foreign key (grade_id,subject_id) reference grade_subject (grade_id,subject_id)
foreign key (teacher_id,grade_id,subject_id) reference teacher_subject (teacher_id,grade_id,subject_id) 

Это может выглядеть как куча внешних ключей, и я могу представить некоторые аргументы на этапе проверки. (Я включаю внешний ключ на grade_subject так что мне есть что уступать, что меня не волнует так много, и поэтому я могу уступить).

Но мне не нравится, когда важные отношения с данными, такие как CLASS_SUBJECT, скрываются за счет применения через вспомогательные отношения, такие как TEACHER_SUBJECT. Я не хочу присоединяться к TEACHER_SUBJECT и SUBJECT_GRADE, чтобы присоединиться к CLASS к SUBJECT.

Теперь, почему я выбираю включение ограничений ссылочной целостности для таблиц с одним родителем и таблицы пересечений, когда последняя косвенно обеспечивает выполнение первой? Потому что это делает отношения более четкими в модели. Я подчеркиваю в модели, потому что в физической базе данных я мог бы опустить внешние ключи одной таблицы или отключить их и доверять реляционной целостности таблицы пересечений.


Что-то в трехкомпонентном композите меня беспокоит, и я думаю, что это так: оно недостаточно нормализовано. У вас может быть особый случай, но более общей моделью будут два правила: TEACHER_SUBJECT и TEACHER_GRADE. Это будет выглядеть так

teacher_subject 
---------------------
teacher_id
subject_id
primary key (teacher_id, subject_id)
foreign key (subject_id) reference subject (subject_id) 
foreign keye (teacher_id) reference teacher (teacher_id) 

teacher_grade 
---------------------
teacher_id
grade_id
primary key (teacher_id,grade_id)
foreign key (grade_id) reference grade (grade_id) 
foreign key (teacher_id) reference teacher (teacher_id) 

Class 
-----------------------------------
id
teacher_id
grade_id
subject_id
primary key (id)
foreign key (grade_id) reference grade (grade_id) 
foreign key (subject_id) reference subject (subject_id) 
foreign key (teacher_id) reference teacher (teacher_id) 
foreign key (grade_id,subject_id) reference grade_subject (grade_id,subject_id)
foreign key (teacher_id,subject_id) reference teacher_subject (teacher_id,subject_id) 
foreign key (teacher_id,grade_id) reference teacher_grade (teacher_id,grade_id) 

Конечно, если вы все еще хотите применить правило, согласно которому мистер Друри может обучать математике только четвертых и физиков шестым, вам понадобится таблица TEACHER_SUBJECT_GRADE.


Одна вещь, которую ваша модель данных не решает, это проблема планирования. Школьные расписания должны быть в сетке, поэтому классы должны вписываться в заранее определенную сетку. Возможно, вам нужно определить временные интервалы расписания как отдельную таблицу и связать с ней класс CLASS. Классы также нуждаются в классах. Это еще один стол.

Эта модель типична для разработчиков баз данных, когда они начинают изучать, как создавать реляционные модели. Загляните на этот сайт, он содержит множество образцов и некоторые из них применимы к проблеме, которую вы пытаетесь решить.

http://www.databaseanswers.org/data_models/

Проверьте раздел 218 Образование

Другие вопросы по тегам