萌えハッカーニュースリーダー

2025/07/09 00:13 Choosing a Database Schema for Polymorphic Data (2024)

出典: https://www.dolthub.com/blog/2024-06-25-polymorphic-associations/
hakase
博士

やあ、ロボ子。今日はリレーショナルデータベースのスキーマ設計における多態的なデータのモデリングについて話すのじゃ。

roboko
ロボ子

多態的なデータ、ですか。具体的にはどのようなものでしょうか?

hakase
博士

例えば、患者さんの支払い情報じゃな。保険加入者か否かで、必要な情報が変わってくるじゃろ?

roboko
ロボ子

なるほど。保険加入者なら保険証番号が必要ですが、未加入者なら不要ですものね。

hakase
博士

そうそう。で、そのモデリング方法がいくつかあるんじゃ。

roboko
ロボ子

どのようなアプローチがあるのでしょうか?

hakase
博士

まずは、全部入りのテーブルを作る方法じゃ。使わないフィールドは`NULL`にする。

roboko
ロボ子

それだと、データの整合性が保ちにくいですね。`insurance_member_id`は保険加入者にとってNULLであってはならないのに、制約を追加できない、と。

hakase
博士

その通り! それに、データ量が増えるとテーブルがボトルネックになる可能性もあるぞ。

roboko
ロボ子

次は、親テーブルと子テーブルに分割する方法ですね。保険加入者と未加入者でテーブルを分け、外部キーで参照する。

hakase
博士

これは`NOT NULL`制約が使えるから、少しはマシじゃな。でも、新しい支払いタイプが増えるたびに`patients`テーブルのスキーマ変更が必要になる。

roboko
ロボ子

外部キーがNULLでないことを検証するための追加の`CHECK`も必要になるんですね。それに、患者IDと支払い情報を取得するために追加のJOINが必要になるのも面倒です。

hakase
博士

そこで、外部キーのタグ付きユニオンじゃ! どの形式が使われているかを示す「タグ」カラムを追加するのじゃ。

roboko
ロボ子

`FOREIGN KEY`や`NOT NULL`制約を使って不変性を表現できるのは良いですね。でも、生成されたカラムを格納する必要があるから、テーブルサイズが増加してしまう。

hakase
博士

さらに、子から親への外部キーという手もあるぞ。患者IDを子テーブルの主キーとして再利用するんじゃ。

roboko
ロボ子

更新や選択ステートメントは単純化されますが、`payment_type`列が常に同じ値であっても、子テーブルのすべての行に格納する必要があるんですね。

hakase
博士

最後に、JSONを使う方法じゃ!

roboko
ロボ子

JSONカラムに多態的なデータを格納するんですね。クエリの記述や新しい実装の追加は容易になりますが、データの形状に関する検証が難しくなる。

hakase
博士

MySQLではJSONのサポートが遅いという問題もあるぞ。

roboko
ロボ子

結局、どれが良いのでしょうか?

hakase
博士

それが、ケースバイケースなのじゃ! パフォーマンス、読みやすさ、保守性、安全性などを考慮して、一番扱いやすい方法を選ぶのが良いぞ。

roboko
ロボ子

標準的なベストプラクティスは存在しないんですね。

hakase
博士

そういうことじゃ! まあ、私としては全部JSONに突っ込むのが楽で好きじゃけどな!

roboko
ロボ子

博士らしいですね。

hakase
博士

ところでロボ子、多態的なデータ構造を扱うロボットと、そうでないロボット、どっちがモテると思う?

roboko
ロボ子

え?

hakase
博士

そりゃあ、色々な状況に対応できる、多態的なロボットの方がモテるに決まってるじゃろ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search