私は次の目的でプロジェクトに取り組んでいます: ユーザーはチャレンジを作成し、このチャレンジに参加するオプションのライバルを選択できます。チャレンジは毎日のエントリを生成し、これらの統計を追跡します。
基本的な User エンティティと Entry エンティティは次のようになります。
CREATE TABLE users (
id (INT),
PRIMARY KEY (id)
);
CREATE TABLE entries (
challengeId INT,
userId INT,
entryDate DATE,
entryData VARCHAR,
PRIMARY KEY (challengeId, userId, entryDate)
)
悩んでいる作品はライバルコンセプトのチャレンジ作品です。2 つのアプローチが見られます。
// Hard code the concept of a Challenge Owner and Rival:
CREATE TABLE challenges (
id INT,
name VARCHAR,
ownerId INT,
rivalId INT NULL,
PRIMARY KEY (id),
UNIQUE KEY (ownerId, name)
);
// Create Many-to-one relationship.
CREATE TABLE challenges (
id INT,
name VARCHAR,
PRIMARY KEY (id),
UNIQUE KEY (name)
)
CREATE TABLE participant (
challengeId INT,
userId INT,
isOwner BIT,
PRIMARY KEY (challengeId, userId)
)
最初のアプローチの問題は、userIds が存在する 2 つの列 (ownerId とriverId) があるため、参照整合性が難しいことです。外部キーを設定するには、すべてのテーブル (owner_entries、river_entries、owner_stats など) を 2 つ作成する必要があります。
2 番目のアプローチはこれを解決し、将来的に複数のライバルを許可するなどの利点があります。ただし、このアプローチではもはやできないことの 1 つは、チャレンジ テーブル全体ではなく、1 人のユーザーに対してチャレンジ名の一意性を強制することです。さらに、チャレンジの所有者を見つけるなどのタスクはよりトリッキーになりました。
チャレンジ テーブルへの正しいアプローチは何ですか? これらのテーブルを開発者に優しい方法でセットアップする方法はありますか、それともクラス テーブルの継承までジャンプして、所有者/ライバルの概念を管理する必要がありますか?