【问题标题】:How to design database request/approval tables?如何设计数据库请求/批准表?
【发布时间】:2012-08-29 16:28:36
【问题描述】:

我有以下几种请求表:

oversea_study_request
course_request
leave_request

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

最好的设计方法是什么?

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

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

【问题讨论】:

  • 所有请求类型的备注和批准是否一致?另外,是否可以在请求本身被批准之前输入备注?可以之后输入吗?什么信息与每条评论相关联——它们是否包含时间戳?当你说“历史”时,你指的是这些时间戳吗?关于“历史”,您还有什么可以告诉我们的吗?您是否需要预定义的批准“步骤”列表(如在文档管理或 PDM 系统中)?另外,您正在使用哪个 DBMS,您打算利用 clustering
  • 我已接受答案。谁能提供进一步的建议?

标签: database database-design


【解决方案1】:

类似于这里的字段组织问题:How to better organise database to account for changing status in users;和my answer there

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

overseas study = 1
course = 2
leave = 3

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

如果cmets和approves不一定在一起,那么:

Table2: actions
    id, request_id, action_type, action_date

Table3: comments
    id, request_id, comment, comment_date

当然,添加 user_id、username 等表/字段。 (每个表中的id 是它自己的主键)

每个请求 + 操作 + cmets 都可以通过 SELECTLEFT JOINs 找到

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

【讨论】:

    猜你喜欢
    • 2012-08-21
    • 2018-10-08
    • 2017-06-23
    • 2018-12-08
    • 2011-03-16
    • 2015-06-06
    • 2017-01-15
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多