我有以下类型的请求表:
oversea_study_request
course_request
leave_request
在这些请求功能中,审批人员可以发布多个备注,还可以批准或拒绝请求。系统必须能够捕获所采取操作的历史记录。
设计它的最佳方法是什么?
- 我是否应该创建一个公用表来存储批准信息和备注。
- 我是否应该在每个请求表中存储批准信息和备注。
有人可以就每种方法的优缺点提出建议吗?
我有以下类型的请求表:
oversea_study_request
course_request
leave_request
在这些请求功能中,审批人员可以发布多个备注,还可以批准或拒绝请求。系统必须能够捕获所采取操作的历史记录。
设计它的最佳方法是什么?
有人可以就每种方法的优缺点提出建议吗?
类似于此处的字段组织问题:如何更好地组织数据库以考虑用户状态的变化;和我的回答:
如果所有请求的字段、字段类型和信息都相同,包括必填(NOT NULL
)和可选等,那么最好将所有请求放在一张requests
表中。指定一个字段为request_type
,使用 int 以提高效率和 SQL 便利性,或ENUM 类型。例子:
overseas study = 1
course = 2
leave = 3
同样,对approvals
表也这样做......如果每种类型的过程相同,则将它们存储在一起。存储请求 ID ( requests.id
)。由于您可能有多个批准评论和批准+拒绝,请将它们存储在approvals.action
和中approvals.action_date
。如果“操作”独立于“批准/拒绝”——也就是说,如果您可以发表评论而不批准/拒绝,或者如果您可以批准/拒绝而不发表评论——那么单独存储actions
andcomments
并包含request.id
.
所以你有了:
Table1: requests
id INT
request_type INT (or ENUM)
request_date DATETIME
...
Table2: approvals (or 'actions', to be general)
id
request_id # (refers to requests.id above)
action_type # (approve or reject)
action_date
comment
如果评论和批准不一定在一起,那么:
Table2: actions
id, request_id, action_type, action_date
Table3: comments
id, request_id, comment, comment_date
当然,添加 user_id、username 等表/字段。(id
每个表中的都是它自己的主键)
每个请求 + 操作 + 评论都可以用 aSELECT
和LEFT JOIN
s找到
顺便说一句,这是“海外”学习,而不是“海外”学习——这不是飞机上的课程;-)