SQLアンチパターンを読み始めたので、1つ1つ書いてのメモです
目的
- 目的:複数の親テーブルを参照する
- コメントが、bug と 要求機能について、という2つの親を持つ
アンチパターン
- ポリモーフィック関連を定義する
- issue_id の外部キーが定義できない
- issue との 参照整合性制約 が定義できない
CREATE TABLE Comments_6 (
comment_id SERIAL PRIMARY KEY,
issue_type VARCHAR(20),
issue_id BIGINT UNSIGNED NOT NULL,
author BIGINT UNSIGNED NOT NULL,
comment_date DATETIME,
comment TEXT,
FOREIGN KEY (author) REFERENCES Accounts(account_id)
);
Rails だと ポリモーフィック関連 の機能がある( ActiveRecord にある)
用いてもいいパターン
- フレームワークにポリモーフィック関連の機能があるとき
- 車輪の再発明をしてはいけない
- ORM を使った設計を行う際に、子側のテー ブルを設計 / 作成する時点でまだ存在しない親テーブルとの関連を作成できる
解決策
関連を単純化する
- ポリモーフィック関連では、本来あるべき関連が逆になっている
- 今回であれば、コメントが親で、バグや要求機能についてが子
交差テーブル(中間テーブル)を使う
まとめ
テーブル間の関連(リレーションシップ)には、参照元テーブルと参照先テーブルが常にそれぞれ 1 つ しかないことを忘れないようにしましょう。
感想
-
ポリモーフィック関連を使うと、関連が「?」となってしまうことが多くて、使わないでいた。でも、テーブル設計としても、外部キーが設定できない課題があることに気づけた
-
中間テーブルは、課題解決していいものなんだなあ、としみじみ思う