.net - 如何有效地对数据库中的继承进行建模?

标签 .net sql-server oop inheritance database-design

在数据库中建模继承的最佳实践是什么?

权衡是什么(例如可查询性)?

(我对 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

关于.net - 如何有效地对数据库中的继承进行建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/190296/

相关文章:

.net - Windows 应用商店应用中的转换命名空间在哪里

c# - 如果条件无法达到,这怎么办?

sql - 自连接查询

sql-server - 如何知道我使用的是 Azure SQL 数据库还是 Azure SQL 数据仓库?

sql-server - 无法连接到服务器 - 与网络相关或特定于实例的错误

javascript - 将 "class"附加到数组原型(prototype)

c# - 当在 Controller 构造时不知道存储库时,如何在 Controller 中注入(inject)存储库?

.net - 在 Windows 服务停止时优雅地关闭前台线程

java - 调用基于 Spring 的 Web 服务的客户端架构

javascript - 关于OOP的一些问题