首页 > 解决方案 > 关于 SQL Server 数据库设计的问题

问题描述

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

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

标签: sqlsql-serverdatabase-design

解决方案


本质上,您有两个选择

  1. Student镜像表的所有外键GraduatedStudent表。因此,您最终会得到一个镜像,StudentPaymentGraduatedStudentPayment您移动学生时,您还必须移动他们的所有付款(以及任何其他关系)

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

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


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

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

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


推荐阅读