如何表示类表继承(请当前 DBMS 特定的方式)?

sha*_*non 5 database-design sql-server subtypes

我想在 SQL Server 中实现类或表继承(Account、CatAccountDetails、DogAccountDetails)。

我找到了对 MySQL 的推荐:

如何将 IS-A 关系映射到数据库中?

基本上,它是:

  • 在父表 (Account) 和子类型表 (CatAccountDetails, DogAccountDetails) 之间使用相同的主键
  • 将子类型鉴别器列添加到父表和子类型表
  • 在从子类型到父类型表的外键约束中包括共享主键和子类型列

添加一个被限制为单个值的类型列(例如 CatAccountDetails 中的“C”列)感觉有点笨拙,所以我想知道SQL Server 中是否有一个功能可以启用这种情况

另外,如果这是这样做的方法,我是否应该另外定义一些东西来防止这个“未使用”的列在我的 ORM(实体框架)请求表连接时降低性能,比如只在 PK 上创建一个额外的外键?

主要问题是CatAccountDetails将有不同的列DogAccountDetails。在我的应用程序中,猫与狗相比具有不同且更多的属性。旁注,“猫”和“狗”代表我当前场景中的三类网站成员。

sha*_*non 4

最终,我根据评论实现了 ypercube 的建议:

“类型”列可以定义为 SQL-Server 中的计算(但常量)列。我认为它必须如此,PERSISTED这样它才能参与外键约束。

这对于性能和与我的工具的兼容性(实体框架 <= 6.0)都很有效:

CREATE TABLE [dbo].[Account](
    [Id] [int] IDENTITY(1000,1) NOT NULL PRIMARY KEY CLUSTERED,
    [CommunityRole] [int] NOT NULL,
    [FirstName] [nvarchar](50) NOT NULL,
    [LastName] [nvarchar](50) NOT NULL,
CONSTRAINT [UX_Derived_Relation] UNIQUE ([Id], [CommunityRole]))

CREATE TABLE [dbo].[Recruiter](
    [Id] [int] NOT NULL PRIMARY KEY CLUSTERED,
    [CommunityRole]  AS ((1)) PERSISTED NOT NULL,
    [RecruiterSpecificValue]  [int] NOT NULL,
FOREIGN KEY ([Id], [CommunityRole]) REFERENCES Account([Id], [CommunityRole]))

CREATE TABLE [dbo].[Candidate](
    [Id] [int] NOT NULL PRIMARY KEY CLUSTERED,
    [CommunityRole]  AS ((2)) PERSISTED NOT NULL,
    [CandidateSpecificValue]  [int] NOT NULL,
FOREIGN KEY ([Id], [CommunityRole]) REFERENCES Account([Id], [CommunityRole]))
Run Code Online (Sandbox Code Playgroud)

这很好地映射到我在求职板上实施多个离散帐户类型(招聘人员和候选人)。


归档时间:

查看次数:

4397 次

最近记录:

9 年 前