Dot-Net

您如何有效地對數據庫中的繼承進行建模?

  • October 10, 2008

在數據庫中建模繼承的最佳實踐是什麼?

有哪些權衡(例如可查詢性)?

(我對 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)

有一個表代表所有繼承層次結構,這意味著其中的幾列可能是稀疏的。添加了一個鑑別器列,它告訴系統這是什麼類型的行。

給定上面的類,你最終得到這個表:

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

對於行類型為 0(人)的任何行,開始日期將始終為空。

每混凝土表 (TPC)

每個類都有自己的完整表格,沒有對任何其他表格的引用。

給定上面的類,你最終得到這些表:

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

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

引用自:https://stackoverflow.com/questions/190296