1

私は次の目的でプロジェクトに取り組んでいます: ユーザーはチャレンジを作成し、このチャレンジに参加するオプションのライバルを選択できます。チャレンジは毎日のエントリを生成し、これらの統計を追跡します。

基本的な 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 人のユーザーに対してチャレンジ名の一意性を強制することです。さらに、チャレンジの所有者を見つけるなどのタスクはよりトリッキーになりました。

チャレンジ テーブルへの正しいアプローチは何ですか? これらのテーブルを開発者に優しい方法でセットアップする方法はありますか、それともクラス テーブルの継承までジャンプして、所有者/ライバルの概念を管理する必要がありますか?

4

2 に答える 2

1

これを設定する方法は次のとおりだと思います(2番目のアプローチを使用):

CREATE TABLE challenges (id INT, 
                         name VARCHAR, 
                         owner_id INT, 
                         PRIMARY KEY (id),
                         UNIQUE KEY (name, owner_id))

CREATE TABLE participant (challengeId INT,
                          userId INT, 
                          PRIMARY KEY (challengeId, userId))

これにより、チャレンジの所有者を簡単に追跡できますが、個々の参加者を抽出できます。
これにより、所有者によるチャレンジ名を安全に一意にすることもでき、内部の外部キーuserIdparticipant簡単です。「ライバル」は、チャレンジの所有者ではないすべての参加者です。

于 2011-08-24T22:41:38.610 に答える
0

私は最初のアプローチを正しいものとして扱います。ユーザー用に 1 つ、チャレンジ用に 1 つのテーブルを作成できます。

以下のように、1 つのテーブルを 2 回参照できることをご存知ですか?

SELECT * FROM CHALLENGES 
INNER JOIN USERS AS OWNERS ON OWNERS.ID = CHALLENGES.OWNERID
INNER JOIN USERS AS RIVALS ON RIVALS.ID = CHALLENGES.RIVALID

この場合、新しいテーブルを作成せずにライバルと所有者の両方を参照できます。

于 2011-08-24T22:33:33.973 に答える