首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除父行时删除子行的最简单方法是什么,而不知道其父行是什么?

删除父行时删除子行的最简单方法是什么,而不知道其父行是什么?
EN

Stack Overflow用户
提问于 2015-06-24 14:07:14
回答 1查看 444关注 0票数 3

给定多个实体类型:

  1. Cluster
  2. Hypervisor
  3. VirtualMachine

并给出可以属于其中任何一个的属性(但每行不超过一个):

  • CpuInfo
    • CpuSpeed
    • CpuTotal
    • ..。

  • DataStore
  • ..。

删除带有父属性的属性的最简单方法是什么?

尝试解决方案

ON DELETE CASCADE

对于每个可能的父级,ON DELETE CASCADE似乎都需要一个可为空的外键,我认为这是一个糟糕的设计:

代码语言:javascript
复制
CREATE TABLE CpuInfo
(
    -- Properties
    Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    CpuSpeed INT,
    AllocatedTotal INT,
    CpuTotal INT,
    AvailableTotal INT,

    -- Foreign keys for all possible parents
    ClusterId INT,
    HypervisorId INT,
    VirtualMachineId INT,

    FOREIGN KEY (ClusterId) REFERENCES Cluster(Id) ON DELETE CASCADE,
    FOREIGN KEY (HypervisorId) REFERENCES Hypervisor(Id) ON DELETE CASCADE,
    FOREIGN KEY (VirtualMachineId) REFERENCES VirtualMachine(Id) ON DELETE CASCADE
);

带触发器的连接表

父母通过连接表与属性相关。例如:

代码语言:javascript
复制
CREATE TABLE HypervisorCpuInfo
(
    HypervisorId INT NOT NULL,
    CpuInfoId INT NOT NULL,

    FOREIGN KEY (HypervisorId) REFERENCES Hypervisor(Id),
    FOREIGN KEY (CpuInfoId) REFERENCES CpuInfo(Id) ON DELETE CASCADE
);

然后,每个实体类型都有一个DELETE触发器。触发器选择实体属性的ID并删除它们。当属性被删除时,子连接行也会通过ON CASCADE DELETE被删除。

不过,这并不能很好地建模业务规则,因为它允许同一个CpuInfo属于多个实体。它还为设计增加了许多表。

有更简单的解决办法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-24 16:04:21

我认为“连接表”可能适合于DRYness (由于1:n关系,它不是真正的连接)

您可以将您的“连接表”称为“超级表”(类似于“机器”--对不起,我不是本地人):

在这个表中,您将属性的所有键(使每个外键列唯一以确保1:1*)。您的“机器”(ClusterHypervisorVirtualMachine)的类型就在您已经尝试过的“三键”中--也在超级表中。为了确保“机器”只有一个实体,添加一个约束:

代码语言:javascript
复制
ALTER TABLE CpuInfo WITH CHECK ADD CONSTRAINT [CK_keyIDs] CHECK (
(ClusterId IS NULL AND HypervisorId IS NULL AND VirtualMachineId IS NOT NULL)
OR (ClusterId IS NULL AND HypervisorId IS NOT NULL AND VirtualMachineId IS NULL)
OR (ClusterId IS NOT NULL AND HypervisorId IS NULL AND VirtualMachineId IS NULL)) GO

好的是,您对实体非常自由,您可以同时允许一个PC成为一个Cluster

*钥匙栏!ID必须是唯一的

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31028868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档