给定多个实体类型:
ClusterHypervisorVirtualMachine并给出可以属于其中任何一个的属性(但每行不超过一个):
CpuInfo CpuSpeedCpuTotal
DataStore删除带有父属性的属性的最简单方法是什么?
尝试解决方案
ON DELETE CASCADE
对于每个可能的父级,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属于多个实体。它还为设计增加了许多表。
有更简单的解决办法吗?
发布于 2015-06-24 16:04:21
我认为“连接表”可能适合于DRYness (由于1:n关系,它不是真正的连接)
您可以将您的“连接表”称为“超级表”(类似于“机器”--对不起,我不是本地人):
在这个表中,您将属性的所有键(使每个外键列唯一以确保1:1*)。您的“机器”(Cluster、Hypervisor、VirtualMachine)的类型就在您已经尝试过的“三键”中--也在超级表中。为了确保“机器”只有一个实体,添加一个约束:
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必须是唯一的
https://stackoverflow.com/questions/31028868
复制相似问题