我正在开发一个Web应用程序来替换基于纸张的表单来请求创建/修改/删除课程,我需要有关存储所请求项目的最佳数据库设计实践的帮助。
注意
数据库仅用于请求的数据。请求获得批准后,必须手动将数据输入其他系统。 (我们无法控制这一点)
请求在获得批准之前可以多次修改,我们需要每个请求的修订历史记录
我们需要跟踪每个请求的状态
创建课程有30多个问题
修改课程有3-30个问题(取决于需要修改的项目数量)
删除课程有5个问题
我的方法1
在这种方法中,我会在RequestDetail
表中存储创建/修改/删除的所有数据。由于每个RequestDetail
可以包含多个项目,例如CourseMode
(例如在线,面对面),因此每个RequestDetail
都会关联一些表格。
下表是一个例子:
当用户请求创建课程(RequestID:1
)时,有两个修订(标题和费用已更改),直到获得批准。但修订和删除的所有列都是NULL
。
当用户请求修改CourseFee(RequestID:2
)时,用户输入新费用和修订原因,其余的创建和删除列为NULL
。
当用户请求删除课程(RequestID:3
)时,用户输入删除原因,其余列再次为NULL
。
由于此数据的目的更像是数据仓库,这可以简单易用吗?但是表格需要允许几乎所有字段都使用Null(对于创建,大多数字段都是必需的)。
我的方法2
在这种方法中,请求的修订与第一种方法的处理方式相同,但为修订和删除创建单独的表。但这种做法似乎多余而且不干净。
我个人更喜欢第一种方法,但在这种情况下,最好的数据库设计实践是什么?有什么我忽略的或者我需要小心吗?
答案 0 :(得分:0)
听起来像修改可以改变课程的任何内容,所以如果你有单独的CreateRequest和ReviseRequest表,几乎每列都必须重复。我认为没有任何理由这样做。
由于大多数数据无关紧要,删除可能更具争议性。尽管如此,我还没有看到通过为它制作单独的表格而获得的任何东西。那么如果无关字段为空怎么办?所以它有一堆空值。
实际上我不会为“修订原因”和“删除原因”创建单独的列。我只需要制作一个列并称之为“请求原因”或其他一些。
你应该有一些字段告诉你它是哪种类型的请求。 (或者FormTypeID是什么?)