假设我想用员工和项目建模系统。每个员工可以是0到n个项目的一部分,项目可以有0到n个员工。为了对此进行建模,我使用以下关系创建了3个表employee
,project
和work
| employee
| (0..n)< ----> (1..1)| work
| (1..1)< ----> (0..n)| project
|
到目前为止,表work
只有两个属性(来自员工条目的id和来自项目的id),这很好。
每个项目还必须有一个公开的“聊天”和一个私人的。公众允许公司中的每个人查看和发送消息到该项目的聊天。另一方面,在私有项目中,只有属于该特定项目的员工才能查看和发送消息。
公众聊天很容易建模,因为每个人都可以看到这些消息。我怀疑是私人的。我想强制私有消息的条件进入数据库,以便私有消息与作为该特定项目一部分的雇员相关。我发现这样做的方法是向表id
添加work
并将此id用作private_message
表中的外键。所以这两个表之间的关系是:
| private_message
| (1..1)< ----> (0..n)| work
|
这是模拟这种情况的好方法吗?如果没有,我怎么能改进这个模型?
感谢。
答案 0 :(得分:1)
根据您描述的内容,消息与创建消息的员工之间存在一对一的关系,并与其所属的项目建立一对一的关系。鉴于此,我将这两个关系存储为消息本身的一部分,并将private_message
表建模为:
id, employee_id, project_id, message, whatever other field you need
然后,您可以使用现有的work
表,根据使用以下查询分配的项目,确定任何单个员工应该能够看到哪些消息:
SELECT private_message.*
FROM private_message
INNER JOIN
(SELECT project_id
FROM [work]
WHERE employee_id = <employee_id of user you need messages for>) assigned_projects
ON private_message.project_id = assigned_projects.project_id
答案 1 :(得分:0)
我不这样做。我会像你最初设计的那样保留工作台,但是添加一个将两个id连接起来的字段。然后我会从private_message表中引用这个字段。
添加id字段可以使您重复记录。