sql - 关于 SQL Server 数据库设计的问题
问题描述
我有一个名为 Student 的数据库表,用于存储学生的信息,但是当学生毕业时,他们的信息不再存储在 Student 表中,但我仍然想存储该信息以供进一步使用。所以我最好的方法是将该信息推送到另一个名为 GradgedStudent 的表中(不允许学生表存储毕业学生信息)
我还有一个名为 StudentsPayment 的表,它使用学生表的外键(学生 ID)。当我将毕业学生从学生表中推开时,StudentsPayment 收到一个错误,它无法再在学生表中找到该学生 ID。我无论如何都无法在设计中解决这个问题,所以请帮忙。
解决方案
本质上,您有两个选择
Student
镜像表的所有外键GraduatedStudent
表。因此,您最终会得到一个镜像,StudentPayment
当GraduatedStudentPayment
您移动学生时,您还必须移动他们的所有付款(以及任何其他关系)在表中添加一个标志来
Student
表示IsGraduated
(或者,甚至更好地相反IsActive
),你就完成了。您始终可以使用视图来复制功能,CurrentStudent
如果GraduatedStudent
那是您想要做的。
我知道我会选择哪个选项。猜哪个没有积分!
编辑添加一些关于评论的观点:
在学生表中有一个外键调用 IsInRoom 存储了房间表的房间 ID,当我勾选那是研究生标志时,那个房间的信息仍然存在(那个研究生不应该在那个房间里,因为......他毕业了)但是有些我还是想知道他用的是什么房间
这很容易解决。您引入一个RoomHistory
表并使该表可以为IsInRoom
空。当学生毕业时,您将其当前值清空并在表中IsInRoom
添加一条记录。RoomHistory
当/如果学生移动房间时,这对于存储完整的历史记录也可能很有用。您可以添加一些额外的列来存储它们何时开始和停止使用特定房间。
推荐阅读
- python - 使用 import youtube_dl 在 python 脚本中使用 Youtube-dl
- mysql - 删除数据库中除最后日期外的所有项目
- angular - 子路由中父路由的角度获取参数仅适用于具有空路径的路由
- python - 如何获取条件成立的二维数组小节的开始和结束
- python - 如何在下拉短划线图组件中创建查询以显示列名称
- python - itertools.permutations 是否有模式
- android - 带有livedata的kotlin扩展函数返回null?
- html - 我可以让孩子滚动并忽略其固定的父母吗?
- angular - 始终将所有星星保留在 div 中
- coq - Isabelle/HOL 有自己的战术语言吗?