0

我有以下类型的请求表:

oversea_study_request
course_request
leave_request

在这些请求功能中,审批人员可以发布多个备注,还可以批准或拒绝请求。系统必须能够捕获所采取操作的历史记录。

设计它的最佳方法是什么?

  • 我是否应该创建一个公用表来存储批准信息和备注。
  • 我是否应该在每个请求表中存储批准信息和备注。

有人可以就每种方法的优缺点提出建议吗?

4

1 回答 1

4

类似于此处的字段组织问题:如何更好地组织数据库以考虑用户状态的变化;和我的回答

如果所有请求的字段、字段类型和信息都相同,包括必填(NOT NULL)和可选等,那么最好将所有请求放在一张requests表中。指定一个字段为request_type,使用 int 以提高效率和 SQL 便利性,或ENUM 类型。例子:

overseas study = 1
course = 2
leave = 3

同样,对approvals表也这样做......如果每种类型的过程相同,则将它们存储在一起。存储请求 ID ( requests.id)。由于您可能有多个批准评论和批准+拒绝,请将它们存储在approvals.action和中approvals.action_date。如果“操作”独立于“批准/拒绝”——也就是说,如果您可以发表评论而不批准/拒绝,或者如果您可以批准/拒绝而不发表评论——那么单独存储actionsandcomments并包含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每个表中的都是它自己的主键)

每个请求 + 操作 + 评论都可以用 aSELECTLEFT JOINs找到

顺便说一句,这是“海外”学习,而不是“海外”学习——这不是飞机上的课程;-)

于 2012-08-29T08:28:36.223 回答