Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

感想

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした