2013-02-10 111 views
2

假設我想用僱員和項目對系統建模。每個員工可以是0到n個項目的一部分,一個項目可以有0到n個員工。爲了建立這個模型我創建了3個表,employee,projectwork與以下關係數據庫中的三元關係

| employee | (0..n)< ---->(1..1)| work | (1..1)< ---->(0..n)| project |

到目前爲止,表work只有兩個屬性(來自員工條目的id和來自項目的id)並且工作正常。

每個項目還必須有一個公共「聊天」和一個私人的。公衆允許公司的每個人都可以看到併發送消息給該項目的聊天。另一方面,在私人項目中,只有屬於該特定項目的員工才能看到併發送消息。

公共聊天很容易建模,因爲每個人都可以看到消息。我的疑問是關於私人的。我想強制私人消息的條件進入數據庫,因爲私人消息與作爲該特定項目一部分的員工有關。我發現這樣做的方法是在表work上添加一個id,並將該ID用作private_message表中的外鍵。所以這兩張表之間的關係是:

| private_message | (1..1)< ---->(0..n)| work |

這是模擬這種情況的好方法嗎?如果不是,我該如何改進這個模型?

謝謝。

+0

您能定義'work'嗎? – 2013-02-11 14:49:45

回答

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 
0

我不會那樣做。我會按照最初設計的方式保留工作表,但添加一個連接兩個ID的字段。然後我會從private_message表中引用這個字段。

添加一個ID字段工作打開你重複記錄。

+0

可通過在'work'表中爲'employee_id,project_id'添加一個唯一約束來避免重複記錄問題。 – 2013-02-10 18:05:22