【问题标题】:Database design for create/revise/delete request form创建/修改/删除请求表的数据库设计
【发布时间】:2015-06-06 14:41:09
【问题描述】:

我正在开发一个 Web 应用程序,该应用程序取代了纸质表单以请求创建/修订/删除课程,我需要有关存储请求项目的最佳数据库设计实践的帮助。

注意

  • 数据库仅用于请求的数据。一旦请求被批准,数据必须手动输入到不同的系统中。 (我们无法控制)

  • 请求在获得批准之前可能会被多次修改,我们需要每个请求的修改历史记录

  • 我们需要跟踪每个请求的状态

  • 创建课程有 30 多个问题

  • 修改一门课程有3-30+道题(取决于需要修改的项目数)

  • 删除一门课程有5道题

我的方法 1

在这种方法中,我会将用于创建/修改/删除的所有数据存储在 RequestDetail 表中。由于每个RequestDetail 可以有多个项目,例如CourseMode(例如在线、面对面),因此每个RequestDetail 都有一些表关联。

下表是一个示例: 当用户请求创建课程 (RequestID:1) 时,在获得批准之前有两个修订(标题和费用更改)。但是 Revision 和 Deletion 的所有列都是NULL

当用户请求修改 CourseFee (RequestID:2) 时,用户输入新费用和修改原因,剩余的创建和删除栏为 NULL

当用户请求删除课程 (RequestID:3) 时,用户输入删除原因,剩余的列再次为 NULL

既然这些数据的目的更像是一个数据仓库,这是否简单易处理?但是表需要允许几乎所有字段为 Null(创建时,大部分字段都是必需的)。

我的方法 2

在这种方法中,请求修订的处理方式与第一种方法相同,但为修订和删除创建单独的表。但这种方法似乎多余且不干净。

我个人更喜欢第一种方法,但在这种情况下,最好的数据库设计实践是什么?有什么我忽略或需要注意的吗?

【问题讨论】:

    标签: sql-server database-design database-schema


    【解决方案1】:

    在我看来,修订可以改变课程的任何内容,所以如果您有单独的 CreateRequest 和 ReviseRequest 表,几乎每一列都必须复制。我看不出有什么好的理由这样做。

    删除可能更具争议性,因为大多数数据是不相关的。尽管如此,我还是看不到为它制作一个单独的表格有什么好处。那么如果无关字段为空怎么办?所以它有一堆空值。

    实际上,我不会为“修订原因”和“删除原因”创建单独的列。我只想写一列,称之为“请求原因”或类似的东西。

    您应该有一些字段告诉您它是哪种类型的请求。 (或者这就是 FormTypeID 是什么?)

    【讨论】:

    • 是的,FormTypeID 就是告诉它是哪种类型的请求。如果FormTypeID 是“删除”,那么该行将有许多空值,因为大多数字段与课程删除无关。不为“修订原因”和“删除原因”创建单独的列是有意义的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2012-08-21
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多