C#、Entity Framework Core、SQL Serverを使用した継承モデル化の実践
データベースにおける継承のモデル化:.NET、SQL Server、OOP の観点から
オブジェクト指向プログラミング (OOP) の重要な概念である継承は、データベース設計にも適用できます。継承を活用することで、データモデルの冗長性を減らし、コードの保守性を向上させることができます。
.NET と SQL Server における継承
.NET では、インターフェースと抽象クラスを使用して継承を実装できます。インターフェースは、オブジェクトが持つべき動作を定義します。抽象クラスは、共通の属性とメソッドを持つオブジェクトのテンプレートを提供します。
SQL Server では、テーブル間の親子関係を定義することで継承を表現できます。親テーブルは、子テーブルに共通する属性を格納します。子テーブルは、親テーブルの属性に加えて、そのテーブル固有の属性を格納します。
継承モデル化の利点
- データモデルの冗長性を減少
- コードの保守性を向上
- データの整合性を保ちやすい
- 拡張性と柔軟性を向上
- 設計が複雑になる可能性がある
- パフォーマンスの低下を招く可能性がある
- 適切な設計手法を選択する必要がある
- テーブル階層モデル
- クラス階層モデル
- シングルテーブルモデル
各手法のメリットとデメリット
手法 | メリット | デメリット |
---|---|---|
テーブル階層モデル | シンプルで分かりやすい | パフォーマンスの低下を招く可能性がある |
クラス階層モデル | 柔軟性が高い | 設計が複雑になる可能性がある |
シングルテーブルモデル | パフォーマンスが良い | 設計が複雑になる可能性がある |
具体的な例
- 従業員管理システム
- 商品管理システム
// Person.cs
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
// Employee.cs
public class Employee : Person
{
public string JobTitle { get; set; }
public decimal Salary { get; set; }
}
// Customer.cs
public class Customer : Person
{
public string Address { get; set; }
public string PhoneNumber { get; set; }
}
// MyContext.cs
public class MyContext : DbContext
{
public DbSet<Person> People { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Customer> Customers { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=MyDatabase;Integrated Security=True");
}
}
// Program.cs
public class Program
{
public static void Main(string[] args)
{
using (var context = new MyContext())
{
// データの追加
context.People.Add(new Person { Name = "John Doe" });
context.Employees.Add(new Employee { Name = "Jane Doe", JobTitle = "Software Engineer", Salary = 100000 });
context.Customers.Add(new Customer { Name = "Mike Jones", Address = "123 Main Street", PhoneNumber = "123-456-7890" });
context.SaveChanges();
// データの取得
var person = context.People.Find(1);
var employee = context.Employees.Find(2);
var customer = context.Customers.Find(3);
Console.WriteLine(person.Name); // John Doe
Console.WriteLine(employee.JobTitle); // Software Engineer
Console.WriteLine(customer.Address); // 123 Main Street
}
}
}
説明
Person
クラスは、Id
とName
という 2 つのプロパティを持つ基底クラスです。Employee
クラスは、Person
クラスから派生し、JobTitle
とSalary
という 2 つの追加プロパティを持っています。Customer
クラスは、Person
クラスから派生し、Address
とPhoneNumber
という 2 つの追加プロパティを持っています。MyContext
クラスは、Entity Framework Core の DbContext クラスから派生し、People
、Employees
、Customers
という 3 つの DbSet プロパティを持っています。Program
クラスは、MyContext
クラスを使用して、データベースとの接続、データの追加と取得、コンソールへの出力を行います。
実行
上記のコードを Visual Studio で実行すると、以下の出力がコンソールに表示されます。
John Doe
Software Engineer
123 Main Street
メリット
- シンプルで分かりやすい
- 実装が簡単
- 複雑なモデルには不向き
クラス階層モデルは、オブジェクト指向プログラミングの概念に基づいて、継承を表現します。インターフェースと抽象クラスを使用して、コードの再利用性と拡張性を向上させます。
- 柔軟性が高い
- コードの再利用性と拡張性が高い
シングルテーブルモデルは、すべてのデータを 1 つのテーブルに格納する手法です。継承関係にあるエンティティは、列を使用して区別されます。
- パフォーマンスが良い
- 設計がシンプル
- データの冗長性が増加する
上記の 3 つの方法以外にも、データベースにおける継承モデル化には、以下の方法があります。
- ビュー
- ストアドプロシージャ
- トリガー
これらの方法は、特定の状況で有効な場合があります。
選択基準
どの方法を選択するかは、以下の要件に基づいて決定する必要があります。
- データモデルの複雑性
- 拡張性
- 保守性
.net sql-server oop