-1

作为高中数据库设计任务的一部分,我有点卡在类表上。到目前为止创建的表是:

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

任何建议将不胜感激。

4

2 回答 2

0

当开始学习如何创建关系模型时,此模型对于数据库设计人员来说是典型的。看看这个网站,包含大量样本,其中一些适用于您要解决的问题

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

检查第 218 节教育

于 2012-04-20T04:03:44.220 回答
0

数据建模是在关系图中表示现实世界的艺术。你的模式是正确的,但它是真的吗?

考虑一下,什么是 CLASS?这是一个老师、一个科目和一个年级。这些是你的关系。此外,您希望强制执行主题适用于该年级并且教师可以在该年级教授该主题的规则。

我认为您的问题在于在交叉表中使用代理键。这些是代表您的多对多关系的表: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 链接到该表格。班级也需要教室。那是另一张桌子。

于 2012-04-20T07:18:05.873 回答