【发布时间】:2014-02-28 07:34:51
【问题描述】:
我有一对必须合理频繁发生的逻辑实体关系。
考虑两个实体Parent 和Child。不出所料,每个Parent 至少有一个或多个Children。
到目前为止很明显。
此外,每个Parent 都有一个收藏夹 Child。
我有一些限制或要求来告知最佳解决方案,
Child和Parent都有一个主键,它是一个身份列。解决方案必须强制执行完整性(尽可能)。我不希望有没有孩子的父母、没有最喜欢的孩子的父母或孤儿。
我想简单快速地访问父母最喜欢的孩子。
我希望所有孩子(包括收藏夹)都驻留在同一个表中,这样我就可以在没有联合或联接的情况下搜索它们。
我需要能够将数据插入表中。
这是我的起点,fiddle here
CREATE TABLE [Parent]
(
[Id] INT NOT NULL IDENTITY,
[FavouriteChildId] INT NOT NULL,
[Other] NVARCHAR(MAX) NOT NULL,
CONSTRAINT [PK_Parent] PRIMARY KEY ([Id])
);
CREATE TABLE [Child]
(
[Id] INT NOT NULL IDENTITY,
[ParentId] INT NOT NULL,
[Other] NVARCHAR(MAX) NOT NULL,
CONSTRAINT [PK_Child] PRIMARY KEY ([Id]),
CONSTRAINT [FK_Child_Parent]
FOREIGN KEY ([ParentId]) REFERENCES [Parent]([Id])
);
ALTER TABLE [Parent]
ADD CONSTRAINT [FK_Parent_FavouriteChild]
FOREIGN KEY ([FavouriteChildId]) REFERENCES [Child]([Id]);
这满足了我的所有要求,除了我不能插入数据。
【问题讨论】:
-
您无法满足您的要求,因为单个
INSERT语句只能影响单个表并且SQL Server 不支持延迟约束。因此,您遇到了“没有孤儿”和“没有没有孩子的父母”的鸡与蛋问题 -
@Damien_The_Unbeliever,这就是我所在的位置,解决它的最佳妥协是什么?我试图思考其他模式可能会提供一个好的解决方案,显然,能够插入很重要。
-
我会允许没有孩子的父母存在。没有这种限制,其余的一切都很容易实现。
-
@Damien_The_Unbeliever,这是我上次遇到这种情况时所做的,我需要记忆方面的帮助。如果您愿意,可以将其作为答案。
-
您是否尝试过 OUTPUT 子句用一个语句插入两个表?像 INSERT INTO Parent ... OUTPUT .. INTO Child ...
标签: sql sql-server database-design sql-server-2012