数据库中的三元关系

时间:2013-02-10 17:30:22

标签: mysql sql database database-design

假设我想用员工和项目建模系统。每个员工可以是0到n个项目的一部分,项目可以有0到n个员工。为了对此进行建模,我使用以下关系创建了3个表employeeprojectwork

| 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 |

这是模拟这种情况的好方法吗?如果没有,我怎么能改进这个模型?

感谢。

2 个答案:

答案 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字段可以使您重复记录。