1

私はこの SO-questionを参照しています。ここで、最初の回答では、

UNIQUE は、インデックスのすべての行が一意でなければならないインデックスを指します。つまり、同じ行が、このインデックス内のすべての列について、別の行と同じ非 NULL 値を持つとは限りません。UNIQUE インデックスはクエリの高速化に使用されるだけでなく、データを制限するためにも使用できます。データベース システムでは、データの挿入または更新時にこの個別の値のルールを破ることが許可されていないためです。

私の英語は一番上手ではないので、それはどういう意味なのか気になります。

同じ行が、このインデックスのすべての列について、別の行と同じ非 NULL 値を持つとは限りません

これを私の実際の問題とすばやく結び付けるために、これが私のシナリオです。私は3つのテーブルを持っています

game(gameID, ...), PK(gameID)
player(gameID, playerName, ...), PK(gameID, playerName), FK(gameID)
prop(gameID, playerName, c1, c2, c3, ...) PK(gameID, playerName), FK(gameID, playerName)

これで、ゲームに接続されたプレイヤーは 1-n 個の小道具を選択できるようになりました。このようなプロップでc1 - c3は、トランプの値、より正確には {1,2,3, ..., T, J, Q, K, A} を表しています。

このような 3 枚のカードの組み合わせは同じ値で構成できますが、組み合わせはゲーム内で 1 回しか選択できません。たとえば、プレイヤーは{2,2,3}とを選択できます{A,2,3}が、そのゲームでは、他のプレイヤーは同じ組み合わせを再度選択することはできません。

前文に戻りますが、ステートメントでは 3 つの要素c1, c2, c3が宣言されていません(宣言されていない場合、例の最初の組み合わせは不可能です)。ゲーム内での組み合わせの一意性を保証するための制約として使用できないということですか? これは使用する良い例ですか? 私の特定のケースで 2 つのバリアントを使用する際の違いは何ですか?UNIQUECREATE TABLEUNIQUE(gameID, c1, c2, c3)INDEX(gameID, c1, c2, c3)

最後に、CREATE TABLEその 3 番目のテーブルのステートメントは次のようになります。

create table prop(
    gameID  INTEGER NOT NULL,
    playerName  VARCHAR(25) NOT NULL,
    isBB    BOOLEAN NOT NULL DEFAULT FALSE,
    card1   VARCHAR(1) NOT NULL,
    card2   VARCHAR(1) NOT NULL,
    card3   VARCHAR(1) NOT NULL,
    PRIMARY KEY (gameID, playerName),
    FOREIGN KEY (gameID, playerName) REFERENCES player(gameID, playerName) ON DELETE CASCADE,
    UNIQUE(gameID, c1, c2, c3) /* OR INDEX(gameID, c1, c2, c3)?

)ENGINE=INNODB;
4

1 に答える 1

2

インデックスは、データベース内の検索を高速化するために使用されます。一方、一意の制約は、データベース内の行にルールを適用します (この例では、「gameID、c1、c2、c3」列の値が 2 つの行でまったく同じになることはありません。

のようなクエリを高速化するために、gameID にインデックスを設定できますWHERE gameID = ?。しかし、それはあなたが持っている行が1つだけであることを保証するものではありません.gameID = 1としましょう.そのような制約が必要な場合は、UNIQUE制約が必要です.一意性と索引付けを組み合わせる)。

特定の質問に答えるには:

ゲーム内の組み合わせの一意性を保証する制約として UNIQUE(gameID, c1, c2, c3) を使用できないということですか?

これを行うと、それらの組み合わせはゲームごとに一意になります。

これは INDEX(gameID, c1, c2, c3) を使用する良い例ですか?

これは、ゲームで組み合わせを頻繁に検索する場合の良い例でもあります。

于 2013-01-30T19:22:35.773 に答える