繁体   English   中英

关于SQL服务器数据库设计问题

[英]Question about SQL Server database design

我有一个名为 Student 的数据库表,用于存储学生的信息,但是当学生毕业时,他们的信息不再存储在 Student 表中,但我仍然想存储该信息以供进一步使用。 所以我最好的方法是将该信息推送到另一个名为 GradgedStudent 的表中(不允许学生表存储毕业学生信息)

我还有一个名为 StudentsPayment 的表,它使用学生表的外键(学生 ID)。 当我将毕业学生从学生表中推开时,StudentsPayment 收到一个错误,它无法再在学生表中找到该学生 ID。 我无论如何都无法在设计中解决这个问题,所以请帮忙。

本质上,您有两个选择

  1. 镜像所有外键到Student的表,用于GraduatedStudent表。 因此,您最终会得到StudentPayment的镜像作为GraduatedStudentPayment学生付款,并且当您移动学生时,您还必须移动他们的所有付款(以及任何其他关系)

  2. Student表中添加一个标志来表示IsGraduated (或者,更好的是相反的IsActive ),你就完成了。 如果您想这样做,您始终可以使用视图来复制CurrentStudentGraduatedStudent的功能。

我知道我会选择哪个选项。 猜哪个没有积分!


编辑添加一些关于评论的观点:

在学生表中有一个外键调用 IsInRoom 存储了房间表的房间 ID,当我勾选那是研究生标志时,那个房间的信息仍然存在(那个研究生不应该在那个房间里,因为......他毕业了)但是有些我还是想知道他用的是什么房间

这很容易解决。 您引入了RoomHistory表并使IsInRoom可以为空。 当一个学生毕业时,你 null 他们当前的IsInRoom并在RoomHistory表中添加一条记录。 当/如果学生移动房间时,这对于存储完整的历史记录也可能很有用。 您可以添加一些额外的列来存储它们何时开始和停止使用特定房间。

你可以有一个表,我们称之为 StudentInformations,存储学生信息,无论他们是否已经毕业。 然后你可以通过 Student、GraduateStudent 和 StudentsPayment 访问它。 在此处输入图像描述

不幸的是,您提出了两个相互排斥的要求(1)学生表不允许存储毕业学生信息,以及(2)学生付款表中的学生 ID 必须存在于学生表中。 您可以放宽第一个要求,然后像前面的评论员建议的那样,在学生表中添加一个“已毕业”标志。 或者,您可以创建一个新表,将其命名为 Person,然后其中的主键(person id)成为学生和学生贷款表中的外键。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM