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

取舍是什么(例如可查询性)?

(我最感兴趣的是SQL Server和.NET,但我也想了解其他平台如何解决这个问题.)

推荐答案

有几种方法可以对数据库中的继承建模.您 Select 哪一种取决于您的需要.以下是几个选项:

Table-Per-Type (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

Table-Per-Hierarchy (TPH)

只有一个表表示所有继承层次 struct ,这意味着其中的几个列可能是稀疏的.添加了一个鉴别器列,告诉系统这是什么类型的行.

考虑到上面的类,您将得到以下表格:

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

对于行类型为0(Person)的任何行,startdate将始终为空.

Table-Per-Concrete (TPC)

每个类都有自己的完全形成的表,没有对任何其他表的引用.

考虑到上面的类,您将得到以下表格:

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

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

.net相关问答推荐

如何在dotnet中使用OpenTelemetry Prometheus导出器导出多个版本的度量?

Puppeteer LaunchAsync 在未打开浏览器的情况下挂起

C#.Net 中的可选返回

为什么 .Contains 慢?通过主键获取多个实体的最有效方法?

如何让 DateTimePicker 显示一个空字符串?

防止对话框在按钮的单击事件处理程序中关闭

我可以使用 UriTemplate 将非字符串传递给 WCF RESTful 服务吗?

为什么要判断这个!= null?

注册 COM 互操作与使程序集 COM 可见

C# 方法可以定义为采用的最大参数数是多少?

实体框架 - 无法将 lambda 表达式转换为类型字符串,因为它不是委托类型

为什么 .NET 中不需要 Maven?

使用 XmlSerializer 将空 xml 属性值反序列化为可为空的 int 属性

如何使我的托管 NuGet 包支持 C++/CLI 项目?

是否可以完全用托管的 .NET 语言编写 JIT 编译器(本地代码)

使用 DateTime.ToString() 时获取日期后缀

C# ListView 列宽自动

WinForms 中的模型视图演示者

如何为 Dapper 查询动态创建参数

通过反射获取公共静态字段的值