2017-03-08 2 views
0

questionsanswersのテーブルがあり、それぞれプライマリキーidを持っています。2列のMySQL外部キー:整数AND文字列

そして、次のような構造を持つテーブルvotes:私はvotesに外部キー制約を追加するにはどうすればよい

CREATE TABLE `answers` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    //whatever 
    PRIMARY KEY (`id`) 
) 
CREATE TABLE `questions` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    //whatever 
    PRIMARY KEY (`id`) 
) 
CREATE TABLE `votes` (
    `item_model` varchar(25) COLLATE utf8_unicode_ci NOT NULL, 
    `item_id` int(10) NOT NULL, 
    `vote` int(1) NOT NULL, 
    KEY `item_id_model` (`item_model`,`item_id`) 
) 

The index on votes consists of 2 columns: 
item_model: string - can have one of 2 values: 'Question' or 'Answer' 
item_id: integer - references the question or answer's id 

は、テーブルquestionsanswers上のIDを参照します。一意の参照(item_modelitem_id)を構成するために2つの変数を組み合わせることによってそれを行う方法はありますか?

または悪い練習に投票するために私の選択した構造です。つまり、ピボットテーブルを2つ作成する必要があります。answer_votequestion_vote?最初の質問への答えとして

+0

現在の 'SHOW CREATE TABLE'出力を投稿する – e4c5

答えて

1

...

はありません、それはitem_modelの値に応じて、2つの可能なテーブルを参照する外部キー制約に2列(item_model,item_id)を結合することはできません。

デザインを保存することができます。現在の実装では、そのようなFOREIGN KEY制約を宣言することはできません。


限り代替設計など、考慮すべき一つの可能​​性は、その後answer

id   int COMMENT 'the vote id' 
    item_model ENUM('Question','Answer') 
    question_id int NULL  COMMENT 'FK ref question.id' 
    answer_id  int NULL  COMMENT 'FK ref answer.id' 
    vote   TINYINT 

に、questionにFKとして、FKなどの他の別々の列、1を定義することです我々 2つの別個の外部キー制約を宣言することができます。

item_modelが '質問'のときにanswer_idをNULLにし、question_idを入力する必要があるルールを適用する場合は、BEFORE INSERTおよびBEFORE UPDATEトリガーで強制できます。

+0

あなたの代わりの解決法では、item_modelは無用になりますか?それを削除することをお勧めですか、それとも私が見ていない目的がありますか? –

+1

私は 'question_id'または' answer_id'カラムに値が設定されているかどうかをテストする条件から派生する可能性があるため、 'item_model'を格納することは重複していると考えています。間違いなく冗長です。まだ使用しているかもしれません。それを持っていることに恩恵がなかったら私はそれを取り除くだろう。 ( 'question_id'または' answer_id'のうちの1つだけが入力されるというルールを強制するためにトリガを必要とします) 'item_model'カラムが保持されている場合、トリガはカラムを維持することができます。 )その列を持つと、クエリが簡単になる可能性があります。 – spencer7593