gpt4 book ai didi

sql - 在不知道父行是什么的情况下,删除父行时删除子行的最简单方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:04 26 4
gpt4 key购买 nike

给定多个实体类型:

  1. 集群
  2. 管理程序
  3. 虚拟机

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

  • CpuInfo
    • CPU 速度
    • CpuTotal
    • ...
  • 数据存储
  • ...

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

尝试的解决方案

关于删除级联

ON DELETE CASCADE 似乎要求每个可能的父级都有一个可为空的外键,这让我觉得这是一个糟糕的设计:

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
);

带触发器的联结表

父级通过联结表与属性相关。例如:

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 属于多个实体。它还在设计中添加了很多表格。

有没有更简单的解决方案?

最佳答案

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

您可以将您的“联结表”称为“ super 表”(类似于“机器”[对不起,我不是本地人]):

在此表中,您将所有键放入您的属性(使每个外键列唯一以确保 1:1*)。您的“机器”类型(ClusterHypervisorVirtualMachine)在您已经尝试过的“三键”中 - 也在 super 表。为确保“机器”仅属于一个实体,请添加约束:

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 已经必须是唯一的

关于sql - 在不知道父行是什么的情况下,删除父行时删除子行的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31028868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com