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

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

(我最感兴趣的是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相关问答推荐

您可以为 Func 或 Action 类型的函数或子参数指定默认值吗?

使用字典作为数据源绑定组合框

C#6.0 字符串插值本地化

将客户端证书添加到 .NET Core HttpClient

mstest.exe 在哪里?

ILMerge 最佳实践

处理序列没有元素异常

在 C# 中转义命令行参数

如何退出所有正在运行的线程?

在 C# 中与块等效?

所有数组在 C# 中都实现了哪些接口?

MemoryStream.Close() 或 MemoryStream.Dispose()

ASP.NET Core (.NET Core) 和 ASP.NET Core (.NET Framework) 的区别

文件按文件名模式存在

如何从头开始以编程方式配置 log4net(无配置)

将 Dictionary 转换为匿名对象?

判断对象列表是否包含具有特定值的属性

绑定在代码隐藏中定义的对象

/langversion 的错误选项6无效;必须是 ISO-1、ISO-2、3、4、5 或默认值

Uri.Host 和 Uri.Authority 有什么区别