我不完全清楚你为什么想要你所描述的,但我会以以下方式查看模型......
你有学生
——他们是不同的实体,而不是其他实体的组合
——他们有自己的属性;姓名、出生日期等
你有班级
- 这些是学生群体
- 每个学年同一个“班级”有不同的学生
- 他们也有自己的属性;等级、次等级等
您的模型中有一个我通常不会使用的额外属性
- 如果一个班级有 20 名学生,则每个学生都用从 1 到 20 的辅助 id 标识
这会给我以下维度表
Student Class Grade SubGrade
----------------------- ------------------------ ----------------- -----------------
id INT PK id INT PK id INT PK id INT PK
first_name VARCHAR(45) name VARCHAR(45) name VARCHAR(45) name VARCHAR(45)
last_name VARCHAR(45) grade_id INT FK desc VARCHAR(45) desc VARCHAR(45)
etc, etc subgrade_id INT FK etc, etc etc, etc
该Class
表将有一个唯一的约束,(grade_id, subgrade_id)
因此只有一个类可以是7b
.
然后你需要使用事实表将学生与他们的班级联系起来......
Class_Membership
-----------------------
id INT PK
student_id INT FK
class_id INT FK
academic_year INT
如果一个学生在任何一个学年都应该只上一个班级,那么您将对(student_id, academic_year)
.
Class
或者,您可以在表中列出学年。这意味着您每年都会重复上同一门课,但在某些年份7g
可能不存在该课程(例如,那一年的学生较少)。
同样,你可以让学生从7b
年7c
中转学。在这种情况下,Class_Membership
表可能有一个start_date
字段,也可能有一个end_date
字段。
然而,这些都没有直接创建id_class
字段(1-20 代表一个有 20 名学生的班级)。就我个人而言,我不会有这样的字段,表中的id
字段Class_Membership
可以提供大多数相同的功能,并且可能还有其他功能。但是,如果有必要,您可以简单地将其添加到Class_Membership
表中......
Class_Membership
-----------------------
id INT PK
student_id INT FK
class_id INT FK
academic_year INT
class_member_id INT
那么你也可以对(academic_year, class_id, class_member_id)
.
这里有很大的灵活性,具体取决于您确切的真实世界模型和您的特定需求。但希望这个例子对你来说是一个好的开始;列出实体的维度表,以及将这些实体关联在一起和/或进一步描述实体的事实表(或多个表)。