単一テーブル継承・クラステーブル継承・具象クラス継承について

単一テーブル継承・クラステーブル継承・具象クラス継承について

プログラミング

PofEAA

2017-10-01 16:44:38

概要

リレーショナルなデータベースは継承をサポートをしていないので、オブジェクトの継承関係をデータベースにどのように表現するのか考慮する必要があります。
それを表現する3つのパターン、単一テーブル継承・クラステーブル継承・具象クラス継承とはについて説明します。 

※各パターンの実装におけるメリット・デメリット等には触れません。

前提

今回想定する登場するクラスは4つです。

people_class.png

Rarty PeopleがRich Peopleを継承するという構造はちょっとわかりづらいかもしれませんが、イメージが伝われば良しとします。

People(人々)

全クラスに共通する属性を持っています。

  • idは一意なキーです。
  • nameは名前です。

OridinaryPeople(パンピー)

良識を持った善良なる一般ピーポーです。

  • good_senseは良識です。bool(0か1)で入ります。

RichPeople(成金)

お金と土地を持っているリッチな人々です。
moneyはお金です。
landは土地です。

※単位とか細かいことは考慮していません。

PartyPeople(パリピ)

パーリーピーポー。

  • free_timeは自由な時間です。
  • middle_nameはミドルネームです。

Single Table Inheritance (単一テーブル継承)

単一テーブル継承は、オブジェクトの継承関係を1つのテーブルで表現します。
テーブルにはサブクラスを判断するためのカラム(type)を持たせます。

single_table_inheritance_table.png

RailsでSTIの実装がサポートされているようです。

Class Table Inheritance (クラステーブル継承)

クラステーブル継承は、オブジェクトの継承関係をクラスごとに1テーブルを用意することで表現します。
スーパークラスのテーブルにはスーパークラスの持つカラムを、サブクラスのテーブルにはサブクラスの持つカラムのみを持たせます。

class_table_inheritance.png

Concrete Class Inheritance (具象クラス継承)

具象テーブル継承は、オブジェクトの継承関係を具象クラスだけ対応したテーブルを用意することで表現します。
各テーブルにはスーパークラスが持つカラムを共通属性として持たせます。

concrete_table_inheritance.png

所感

どのパターンを実装するかはテーブル設計のメリット・デメリットとアプリケーション側のロジックのコストの検討次第でしょうか。
何か語弊がある部分や間違いがある場合はご指摘ください。

参考リンク