Similar to the fields organisation question here: How to better organise database to account for changing status in users; and my answer there:
If the all the requests have the same fields, field types and info, including mandatory (NOT NULL
) and optional, etc. then it's better to put all the requests into one requests
table. Designate one field to be request_type
, with an int for efficiency and SQL convenience, or an ENUM type. Example:
overseas study = 1
course = 2
leave = 3
Similarly, do that for the approvals
table also...if the process is the same for each type then store those together. Store the request id (requests.id
). Since you have multiple approval-comments and approval+rejection possible, store these in approvals.action
and approvals.action_date
. If "actions" are independent of "approve/reject" - that is, if you can post a comment without approving/rejecting OR if you can approve/reject without a comment - then store the actions
and comments
separately, and include the request.id
.
So you have:
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
If comments and approvals are NOT necessarily together, then:
Table2: actions
id, request_id, action_type, action_date
Table3: comments
id, request_id, comment, comment_date
And of course, add the user_id, username, etc. tables/fields. (The id
in each table is it's own Primary Key)
Each request + actions + comments can be found with a SELECT
and LEFT JOIN
s
Btw, it's "overseas" study, not "oversea" study - it's not a course in an airplane ;-)