作为高中数据库设计任务的一部分,我有点坚持使用类表。到目前为止创建的表格是:
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的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
非常感谢任何建议。
答案 0 :(得分:0)
此模型是数据库设计人员在开始学习如何创建关系模型时的典型模型。 看看这个网站,包含大量样本,其中一些适用于你试图解决的问题
http://www.databaseanswers.org/data_models/
查看218教育
部分答案 1 :(得分:0)
数据建模是在关系图中表示现实世界的艺术。你的模式是正确的,但这是真的吗?
考虑什么是CLASS?这是一个教师,一个主题和一个等级。那是你的关系。此外,您希望强制执行SUBJECT适用于该GRADE的规则,并且教师可以在该GRADE中教授该SUBJECT。
我认为你的问题在于在交集表中使用代理键。这些表格代表您的多对多关系: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
上,所以我有一些东西要承认我不关心那么多,所以可以承认)。
但我不喜欢通过辅助关系(例如TEACHER_SUBJECT)强制执行CLASS_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)
当然,如果您仍然想要执行一项规则,即Drury先生只能将数学教授给第四代和将物理教授给第六代,那么您需要一个TEACHER_SUBJECT_GRADE表。
您的数据模型没有解决的一件事是调度问题。学校时间表必须进行网格划分,因此课程需要适合预先确定的网格。您可能需要将时间表的插槽定义为单独的表,并将CLASS链接到该表。课程还需要课堂。那是另一张桌子。