首页 > 解决方案 > 如何在 SQL 中实现 MECE(互斥,集体穷举)?

问题描述

我正在寻找创建一系列表关系,它们将相互排斥,共同穷举,即形成给定集合的分区。例如,假设您有以下关系:

动物是(仅)一只猫或狗。

狗有名字和最喜欢的玩具。猫有名字和最喜欢的食物。

尝试在 SQL 中对这种关系进行建模的第一个尝试将是一个animals具有一animalId列的表,然后是一个dogs具有 adogId和一favoriteToy列的表,其中dogId具有对 a 的外键引用animalId。然后你可以有一个cats带有 acatId和一favoriteFood列的表,其中catId有一个对 a 的外键引用animalId

但是,这有几个问题,有些似乎可以解决,有些则不能。

另一方面,我可以将所有内容非规范化为一个animals包含favoriteFoodfavoriteToy列的表,但这似乎缺少一个且只有一个列必须为非空的约束。

简而言之,似乎我可以确保相互排他性,但不能确保集体穷举,或者我可以确保集体穷举,但不能确保相互排他。还有另一种方法可以同时给我吗?看起来你在这里可能需要某种循环依赖,但我不确定是否有一种好的方法可以做到这一点而不涉及不必要null的 s (这似乎是治疗比疾病更糟糕的情况)。

标签: sqlrelational-databaserdbms

解决方案


推荐阅读