サーチ…


階層ごとのテーブル

このアプローチは、すべての継承構造を表すためにデータベース上に1つのテーブルを生成します。

例:

public abstract class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime BirthDate { get; set; }
}

public class Employee : Person
{
    public DateTime AdmissionDate { get; set; }
    public string JobDescription { get; set; }
}

public class Customer : Person
{
    public DateTime LastPurchaseDate { get; set; }
    public int TotalVisits { get; set; }
}

// On DbContext
public DbSet<Person> People { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Customer> Customers { get; set; }

生成されるテーブルは次のようになります。

テーブル:Peopleフィールド:ID名前生年月日Discrimitator AdmissionDate JobDescription LastPurchaseDate TotalVisits

'Discriminator'は継承のサブクラスの名前を保持し、 'AdmissionDate'、 'JobDescription'、 'LastPurchaseDate'、 'TotalVisits'はnullにできます。

利点

  • データベースは多くのページング操作を必要とすることがありますが、多くの列に対しては結合が必要ないため、パフォーマンスが向上します。
  • シンプルで使いやすく作成する
  • より多くのサブクラスとフィールドを簡単に追加できます

短所

テーブルの種類ごと

このアプローチでは、データベース上に(n + 1)個のテーブルが生成され、継承構造をすべて表します(nはサブクラスの数)。

の仕方:

public abstract class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime BirthDate { get; set; }
}

[Table("Employees")]
public class Employee : Person
{
    public DateTime AdmissionDate { get; set; }
    public string JobDescription { get; set; }
}

[Table("Customers")]
public class Customer : Person
{
    public DateTime LastPurchaseDate { get; set; }
    public int TotalVisits { get; set; }
}

// On DbContext
public DbSet<Person> People { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Customer> Customers { get; set; }

生成されるテーブルは次のようになります。

テーブル:Peopleフィールド:ID名前生年月日

表:従業員フィールド:PersonId AdmissionDate JobDescription

テーブル:顧客:フィールド:PersonId LastPurchaseDate TotalVisits

すべてのテーブルの 'PersonId'が主キーとなり、People.Idの制約になります

利点

  • 正規化されたテーブル
  • カラムやサブクラスの追加が簡単
  • null可能な列はありません

短所

  • データを取得するには結合が必要です
  • サブクラスの推論はより高価です


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow