1. ホーム
  2. .net

[解決済み] データベースで効果的に継承をモデル化するには?

2022-04-26 02:23:54

質問

データベースで継承をモデル化するためのベストプラクティスは何ですか?

トレードオフ(問合せ可能性など)とは?

(SQL Server と .NET に最も興味がありますが、他のプラットフォームがこの問題にどのように対処しているかも理解したいです)。

どのように解決するのですか?

データベースで継承をモデル化するには、いくつかの方法があります。どれを選ぶかは、あなたのニーズ次第です。ここでは、いくつかの選択肢を紹介します。

テーブル・パー・タイプ(TPT)

各クラスは独自のテーブルを持つ。ベースクラスはすべてのベースクラスの要素を持ち、そこから派生する各クラスは、ベースクラスのテーブルに対する外部キーでもある主キーを持つ独自のテーブルを持ちます。

だから例えば

class Person {
    public int ID;
    public string FirstName;
    public string LastName;
}

class Employee : Person {
    public DateTime StartDate;
}

のようなテーブルになります。

table Person
------------
int id (PK)
string firstname
string lastname

table Employee
--------------
int id (PK, FK)
datetime startdate

テーブル・パー・ヒエラルキー(TPH)

すべての継承階層を表す1つのテーブルがあり、いくつかのカラムは疎になる可能性がある。そのため、いくつかのカラムは空白となる。

上記のクラスがあると、このようなテーブルになります。

table Person
------------
int id (PK)
int rowtype (0 = "Person", 1 = "Employee")
string firstname
string lastname
datetime startdate

行タイプ 0 (Person) の行では、開始日は常に null になります。

テーブル・パー・コンクリート(TPC)

各クラスは、他のテーブルを一切参照しない、それ自身の完全なテーブルを持つ。

上記のクラスがある場合、以下のようなテーブルになります。

table Person
------------
int id (PK)
string firstname
string lastname

table Employee
--------------
int id (PK)
string firstname
string lastname
datetime startdate