0

一部のユーザーとエージェントを含むデータベースがあり、単純なメッセージ システムを追加したいと考えています。

したがって、次の単純なテーブルセットがあります。

[users]
- user_id (PK)

[agents]
- agent_id (PK)

[message_threads]
- message_thread_id (PK)

[message]
- message_id (PK)
- message_thread_id (FK messages_threads.message_thread_id)

私が持っていないのは、メッセージとメッセージを投稿した個人からの関係です。

ユーザーまたはエージェントである可能性があるため、少し行き詰まっているところがあります。これは、解決すべき受け入れられたパターンの一般的な問題であるに違いないと思いますが、そのような議論は見つかりませんでした。

いくつかのオプションがあることはわかっていますが、それらにはすべて短所があります。

オプション 1: メッセージが 2 つの異なるアカウントにリンクされる可能性があるのは好きではありません。

[message]
- message_id (PK)
- message_thread_id (FK messages_threads.message_thread_id)
- user_id (FK users.user_id, ALLOW NULL)
- agent_id (FK agents.agent_id, ALLOW NULL)

オプション 2: これにより、SELECT の 1 つの列ですべてのメッセージを取得することが難しくなります。

[message_by_user]
- message_id (PK)
- message_thread_id (FK messages_threads.message_thread_id)
- user_id (FK users.user_id)

[message_by_agent]
- message_id (PK)
- message_thread_id (FK messages_threads.message_thread_id)
- agent_id (FK agents.agent_id)

ユーザーとエージェントを 1 つのテーブルにまとめることができないことの 1 つです。それは石に設定されています。

4

1 に答える 1

3

ユーザーとエージェントはそれぞれ、私が「人」と呼ぶスーパークラスのサブクラスのようです。person_id を PK として、人用のテーブルをもう 1 つ作成できます。その後、users テーブルの user_id を person_id に置き換えることができます。同様に、agents テーブルの agent_id を person_id に置き換えます。

ユーザーとエージェントの 2 つのサブクラス テーブルでは、person_id が 2 つの役割を果たしていることに注意してください。これは、独自のテーブルの PK であり、persons テーブルの FK でもあります。これにより、ユーザーと個人の間、およびエージェントと個人の間の IS-A 関係の 1 対 1 の性質が強化されます。

あとは、メッセージと人の関係を設定するだけです。場合によっては、メッセージとユーザーまたはエージェントの間に関係があります。

これは、「クラス テーブルの継承」と呼ばれる設計パターンと「共有主キー」と呼ばれる設計パターンの 1 つのインスタンスです。これらの詳細については、Stackoverflow で同じ名前のタグにアクセスするか、Web で Martin Fowler のトピックの扱いを検索してください。

于 2014-12-19T11:02:44.603 に答える