[英]Question about SQL Server database design
我有一个名为 Student 的数据库表,用于存储学生的信息,但是当学生毕业时,他们的信息不再存储在 Student 表中,但我仍然想存储该信息以供进一步使用。 所以我最好的方法是将该信息推送到另一个名为 GradgedStudent 的表中(不允许学生表存储毕业学生信息)
我还有一个名为 StudentsPayment 的表,它使用学生表的外键(学生 ID)。 当我将毕业学生从学生表中推开时,StudentsPayment 收到一个错误,它无法再在学生表中找到该学生 ID。 我无论如何都无法在设计中解决这个问题,所以请帮忙。
本质上,您有两个选择
镜像所有外键到Student
的表,用于GraduatedStudent
表。 因此,您最终会得到StudentPayment
的镜像作为GraduatedStudentPayment
学生付款,并且当您移动学生时,您还必须移动他们的所有付款(以及任何其他关系)
在Student
表中添加一个标志来表示IsGraduated
(或者,更好的是相反的IsActive
),你就完成了。 如果您想这样做,您始终可以使用视图来复制CurrentStudent
和GraduatedStudent
的功能。
我知道我会选择哪个选项。 猜哪个没有积分!
编辑添加一些关于评论的观点:
在学生表中有一个外键调用 IsInRoom 存储了房间表的房间 ID,当我勾选那是研究生标志时,那个房间的信息仍然存在(那个研究生不应该在那个房间里,因为......他毕业了)但是有些我还是想知道他用的是什么房间
这很容易解决。 您引入了RoomHistory
表并使IsInRoom
可以为空。 当一个学生毕业时,你 null 他们当前的IsInRoom
并在RoomHistory
表中添加一条记录。 当/如果学生移动房间时,这对于存储完整的历史记录也可能很有用。 您可以添加一些额外的列来存储它们何时开始和停止使用特定房间。
不幸的是,您提出了两个相互排斥的要求(1)学生表不允许存储毕业学生信息,以及(2)学生付款表中的学生 ID 必须存在于学生表中。 您可以放宽第一个要求,然后像前面的评论员建议的那样,在学生表中添加一个“已毕业”标志。 或者,您可以创建一个新表,将其命名为 Person,然后其中的主键(person id)成为学生和学生贷款表中的外键。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.