类似于这里的字段组织问题: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.action 和approvals.action_date 中。如果“操作”独立于“批准/拒绝”——也就是说,如果你可以发表评论而不批准/拒绝,或者如果你可以批准/拒绝而不发表评论——那么分别存储 actions 和 comments,并且包括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 都可以通过 SELECT 和 LEFT JOINs 找到
顺便说一句,这是“海外”学习,而不是“海外”学习——这不是飞机上的课程 ;-)