1

ユーザー モデルとタスク モデルがあります。

ユーザーがタスクを作成します。これは単純に思えます: タスクには user_idforeign_key があります

しかし、今は共有を導入しています。現在、タスクはユーザーと多対多の関係にありますが、所有者に属しています。

- タスクに user_id を残す (おそらく「owner_id」に名前を変更する) - そして、多対多の結合テーブル (user_tasks または shared_user_tasks) を、共有されているモデル タスクのみにします。

または、次のこともできます: - タスクの user_id を削除します - そして、user_tasks をブール値の「is_owner」との純粋な多対多の関係にして、そのユーザーが所有者かどうかを教えてくれます

または、次のことができます: - タスクの user_id を削除します - そして、user_tasks に shared_user_id と owner_id の両方をリストします。これは、一部のレコードでは、shared_user_id と owner_id が同じ数になることを意味します (上記よりも難しいクエリ)。

ベストプラクティスによると、どちらがより健全ですか?

お時間をいただきありがとうございます。

そして、最初の答えが示唆するように (私は何らかの理由で受け入れるのを少しためらっていますが)、概念的には、2 つの役割は異なります。1 人はタスクの所有者で、もう 1 人は単にタスクを共有された人です。

4

2 に答える 2

1

救助へのノーマライゼーション!おそらく..... (ただし、使用状況によっては、パフォーマンスのために非正規化する余地があるかもしれません)

テーブルUsers-- ユーザー (who) に関する情報を格納します

テーブルTasks-- タスクに関する情報 (タスクとは何か、何をするかなど) を格納します。

テーブルUserTasks-- M->M マッピング。

テーブルUserTaskTypes-- 店舗 (「所有者」、「共有」、「コンサルタント」、「マネージャー」など)

onUserTasksは次のようになります (tsql)

CREATE TABLE UserTasks (
    [TaskID] INT,
    [UserID] INT,
    [UserTaskTypeID] INT,

    FOREIGN KEY FK_UserTasks_TaskID ([TaskID])
            REFERENCES Tasks ([TaskID]),

    FOREIGN KEY FK_UserTasks_UserID ([TaskID])
            REFERENCES Users ([UserID]),

    FOREIGN KEY FK_UserTasks_UserTaskTypeID ([UserTaskTpyeID])
            REFERENCES UserTaskTypes ([UserTaskTypeID]),

    PRIMARY KEY PK_UserTasks ([TaskID], [UserID], [UserTaskTypeID])
 )

また、ビジネス ルールに従って、CHECK CONSTRAINTS を追加して、すべてのタスクに所有者が 1 人だけであることを強制することができます。

このためにクラスター化されたインデックスを選択するのは、PK をクラスター化するのと同じくらい簡単かもしれませんが、インセットでデータを大量にシャッフルすることになります。代わりに、代理自動番号 PK が必要になり、代わりに UNIQUE CONSTRAINT で一意性を強制することができます。

于 2013-06-04T20:48:13.260 に答える