ユーザ間の関係データを保持するMySQLテーブルを作成します。ユーザーAとユーザーBとユーザーBとユーザーAとの関係は異なる場合があります。同じFOREIGN KEY IDを使用する2つのユニークキーでのMySQL CONSTRAINT
例:ボブ(から)アリス(へ)の
- 関係:0.9 - ボブはアリスのものを愛しています。
- アリスから(から)ボブへの関係:0.5 - アリスはボブのものを普通ではないと判断します。
私の質問:私は、ユーザーテーブルにuser_idsを参照する2つの外部キーにUNIQUEキーとして2つの制約を実装している
。これはできますか?それらは2つの別個の一意のキーとして扱われますか?
user_idごとにUserA(から)UserB関係とUserB(から)UserA関係のそれぞれの出現を1つだけ許可するCONSTRAINTを実装するにはどうすればよいですか?私は正しい方法でそれについて行くのですか?
SQL:
CREATE TABLE relationships (
relationship_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
from_user_id MEDIUMINT UNSIGNED NOT NULL,
to_user_id MEDIUMINT UNSIGNED NOT NULL,
relationship_level DECIMAL(1,1) NOT NULL,
PRIMARY KEY (relationship_id),
FOREIGN KEY (from_user_id) REFERENCES users (user_id)
ON DELETE CASCADE ON UPDATE NO ACTION,
FOREIGN KEY (to_user_id) REFERENCES users (user_id)
ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT from_to_relationship UNIQUE KEY (from_user_id, to_user_id),
CONSTRAINT to_from_relationship UNIQUE KEY (to_user_id, from_user_id),
INDEX relationship_from_to (relationship_id, from_user_id, to_user_id, relationship_level),
INDEX relationship_to_from (relationship_id, to_user_id, from_user_id, relationship_level)
) ENGINE=INNODB;
私は、誰かが助けることができると思います。
これは多くのありがとう、いくつかをクリアしました。しかし、PK(from_user_id、to_user_id)に関しては、 "InnoDBはクラスタ化されているので、当然" "relationship_level"もカバーしています。これは、実際にINNODBテーブルがインデックスのリーフページに行を格納する方法によって、このPKから直接特定のrelationship_levelにアクセスできることを意味しますか? – leokennedy
@KennedyLはい。基本的には、テーブル全体がインデックス内に格納されています(「ヒープ」は一切ありません)。したがって、PRIMARY KEYに明示的に記載されているフィールドだけでなく、すべてのテーブルのフィールドをカバーします。論理的な観点から問合せを扱うことは問題ではありませんが、パフォーマンスに関しては重要です(理由を理解するために提供している「索引のみのスキャン」に関するIndex Lukeリンクを参照してください)。 –
完璧、多くのおかげでBranko。私はリンクされた記事を徹底的に読むでしょう。 – leokennedy