2

假设我想为一个包含员工和项目的系统建模。每个员工可以是 0 到 n 个项目的一部分,一个项目可以有 0 到 n 个员工参与其中。为了对此建模,我创建了 3 个表,employee,projectwork具有以下关系

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

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

谢谢。

4

2 回答 2

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
于 2013-02-10T18:20:28.360 回答
0

我不会那样做。我会按照您最初设计的方式保留工作表,但添加一个连接两个 ID 的字段。然后我会从 private_message 表中引用这个字段。

添加一个 id 字段以使您可以重复记录。

于 2013-02-10T17:54:30.727 回答