【问题标题】:Question about SQL Server database design关于 SQL Server 数据库设计的问题
【发布时间】:2021-07-03 07:16:23
【问题描述】:

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

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

【问题讨论】:

  • 只为 IsGraduated(或类似的)表添加一个标志怎么样,您将它们保留在 Student 表中但带有标志。然后,如果您需要将任何毕业生信息绑定到学生表,请创建毕业生信息表以保存学生表中未包含的任何额外信息。
  • 另外,如果您收到有关找不到行的错误,这听起来好像您没有设置外键;因为如果他们这样做了,您将无法“移动”该学生(INSERT 将他们移到不同的表中,DELETE 来自原始表)。
  • 学生表不允许存储毕业学生信息 为什么?捍卫你的方法,不要试图“解决”它。
  • 是的,我认为,在学生表中有一个外键调用 IsInRoom 存储了 Room 表的房间 ID,当我打勾时,那个房间的信息仍然存在(即研究生不应该在那个房间里,因为..他毕业了)但我还是想知道他用的是什么房间
  • 而“学生”总是来来去去。学生可能无法完成学位。费用可能应该附加到一个人身上——不管那个人当前(或过去)与“学校”的关系如何。我认为您需要更彻底地分析和研究您的需求。

标签: sql sql-server database-design


【解决方案1】:

本质上,你有两个选择

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

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

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


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

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

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

【讨论】:

  • 这意味着你必须使用查询?在编辑模式下这可能会导致数据冲突,这是我试图在设计中解决的故障点
  • @Valkyrine 我不明白这个问题 - 但总的来说,使用事务进行原子工作可以确保数据完整性
  • 有些人可能会不小心将记录添加到 RoomHistory,尽管该学生尚未毕业
  • @Valkyrine 您需要进一步研究数据库。所有这些类型的问题都可以在数据库级别轻松解决。查找初学者的“检查约束”
  • 啊,是的,我完全忘记了,谢谢
【解决方案2】:

您可以有一个表,我们称之为 StudentInformations,用于存储学生信息,无论他们是否已毕业。然后你可以通过 Student、GraduateStudent 和 StudentsPayment 访问它。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2010-12-12
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多