0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SQLアンチパターン:ポリモーフィック関連

Posted at

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 つ しかないことを忘れないようにしましょう。

感想

  • ポリモーフィック関連を使うと、関連が「?」となってしまうことが多くて、使わないでいた。でも、テーブル設計としても、外部キーが設定できない課題があることに気づけた

  • 中間テーブルは、課題解決していいものなんだなあ、としみじみ思う

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?