假设我有3张桌子:
employers : id | name | ...
workers: id | name | ...
jobs : id | description | employer_id | ...
我希望雇主能够为几个工人提供工作机会,这样第一个接受报价的工人就能得到这份工作。我正在努力设计一个表来解决这个问题。
我想出了这样一张桌子:
offers: id | job_id | worker_id | status
job_id 和 worker_id 将分别引用作业和工作人员。
状态为包含 "accepted", "pending" and "closed" as possible values. (the default value is "pending")
这里的想法是,当工人接受要约时,要约中相应行的状态设置为“已接受”,其他要约(关于同一工作)的状态为设置为“关闭”。
我认为这可行,但仍然想问你们是否认为这是一个好的有效解决方案。如果没有,那将是一个更好的解决方案。
由于
注意:这是我第一次尝试设计数据库。此外,这不是一个功课。我正和一些朋友一起做一个小项目。
答案 0 :(得分:1)
这可行,是的。但是,您面临的一个问题是,您必须确保只有一名工人接受这项工作,而不是同时接受两份工作。
在你的情况下,你会这样做:
UPDATE offers o
SET status = 'accepted'
WHERE job_id = x
AND worker_id = y
AND NOT EXISTS (SELECT 1 FROM offers WHERE job_id = o.job_id AND status = 'accepted');
当然还有其他可以想象的设计。但这实际上取决于你想要达到的目标。
例如,当pending
和closed
之间的差异对您来说并不重要时,您可以完全摆脱状态字段。
然后你可以简单地在offers
存储工作提供给哪些工作者,在工作表中你可以有一列accepted_by
。