2

従業員とプロジェクトを含むシステムをモデル化するとします。各従業員は 0 から n 個のプロジェクトに参加でき、プロジェクトには 0 から n 人の従業員が従事できます。これをモデル化するために、次の関係を持つ 3 つのテーブル を作成employeeしましたprojectwork

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

これまでのところ、テーブルworkには 2 つの属性 (従業員エントリの ID とプロジェクトの ID) しかなく、これは正常に機能します。

各プロジェクトには、公開の「チャット」と非公開の「チャット」も必要です。パブリックは、社内の全員がそのプロジェクトのチャットを表示してメッセージを送信できるようにします。一方、非公開の場合、その特定のプロジェクトに参加している従業員のみがメッセージを表示および送信できます。

公開チャットは、誰もがメッセージを見ることができるため、モデル化が容易になります。私の疑問は私的なものについてです。プライベート メッセージがその特定のプロジェクトの一部である従業員に関連付けられるように、プライベート メッセージの条件をデータベースに強制したいと考えています。idこれを行う方法は、テーブルに を追加し、workこの ID をprivate_messageテーブルの外部キーとして使用することです。したがって、これら 2 つのテーブルの関係は次のようになります。

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

これは、この状況をモデル化する良い方法ですか? そうでない場合、どうすればこのモデルを改善できますか?

ありがとう。

4

2 に答える 2

1

あなたが説明した内容に基づいて、メッセージはそれを作成した従業員と 1 対 1 の関係を持ち、それが属するプロジェクトと 1 対 1 の関係を持っています。これを考慮して、これら 2 つの関係をメッセージ自体の一部として保存し、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

私はそのようにはしません。最初に設計した作業テーブルを保持しますが、2 つの ID を連結するフィールドを追加します。次に、private_message テーブルからこのフィールドを参照します。

機能する id フィールドを追加すると、レコードが重複する可能性があります。

于 2013-02-10T17:54:30.727 に答える