我目前有三张表:
学生
ID(pk),名称
课程
id(pk)、课程名称、课程时长、课程费用
学生课程
学生课程 ID (主键),学生 ID (外键),课程 ID (外键)
如果一段时间后课程费用发生变化,那么我该如何保留学生以前的课程费用记录?
答案1
你是对的,从架构规范来看,你不能。你必须对 Course_Fee 表进行非规范化,以便它也出现在 Student_course 表中(因为这是唯一一个与参加特定课程的特定学生的现象 1 对 1 映射的表。)
但是还有另一种选择。想象一下在 Course 表中有两行如下:
...
2,'Intro to CS', '15 weeks', 2000.00
...
5,'Intro to CS', '15 weeks', 2500.00
...
因此现在您可以获得以下历史记录:学生以 2000 美元的价格参加旧版本课程,与记录 ID=2 绑定;新生以 2500 美元的价格参加新版本课程,与记录 ID=5 绑定。
模式表达式(例如表定义)无法告诉您有关数据库如何运行的所有信息。即使您考虑了字段、键、约束等,仍然需要考虑应用程序使用表的方式。例如,在这种情况下,应用程序假设可能存在重复的课程,并在其查询中使用 Top(1):
select Top(1) * from Course order by ID DESC
那么,它能表达吗?是的。是的,这是不好的设计吗?最好是非规范化,最好是创建一个带有活动位的课程费用表,这样您就可以停用旧费用,但仍能保持数据和引用完整性。
我会这样做:
Student(Id, Name)
Fee(Id, Fee)
Course(Id, course_name , course_duration , FeeId)
StudentCourse(StudentId, CourseId, FeeId)