sql - 如何在 SQL 中实现 MECE(互斥,集体穷举)?
问题描述
我正在寻找创建一系列表关系,它们将相互排斥,共同穷举,即形成给定集合的分区。例如,假设您有以下关系:
动物是(仅)一只猫或狗。
狗有名字和最喜欢的玩具。猫有名字和最喜欢的食物。
尝试在 SQL 中对这种关系进行建模的第一个尝试将是一个animals
具有一animalId
列的表,然后是一个dogs
具有 adogId
和一favoriteToy
列的表,其中dogId
具有对 a 的外键引用animalId
。然后你可以有一个cats
带有 acatId
和一favoriteFood
列的表,其中catId
有一个对 a 的外键引用animalId
。
但是,这有几个问题,有些似乎可以解决,有些则不能。
- 我可以添加一个
dogId
和一个catId
引用相同的animalId
(我认为这不是一个基本问题,因为我可以在动物中添加一个附加列,它是一个由 cat 和 dog 复制并用于形成复合外键的两个成员枚举) - 我可以添加一个既没有 a也没有
animalId
.animals
catId
dogId
另一方面,我可以将所有内容非规范化为一个animals
包含favoriteFood
和favoriteToy
列的表,但这似乎缺少一个且只有一个列必须为非空的约束。
简而言之,似乎我可以确保相互排他性,但不能确保集体穷举,或者我可以确保集体穷举,但不能确保相互排他。还有另一种方法可以同时给我吗?看起来你在这里可能需要某种循环依赖,但我不确定是否有一种好的方法可以做到这一点而不涉及不必要null
的 s (这似乎是治疗比疾病更糟糕的情况)。
解决方案
推荐阅读
- spring-boot - 哪个 CoroutineScope 用于 Spring Boot WebFlux 端点
- python - Pyspark - UnicodeEncodeError:'ascii'编解码器无法编码字符
- python - 如何在 Python 中对分数列表进行排序?
- session - 如何使 Htmlunit 会话活跃
- amcharts - amCharts V4 地图中的 clickMapObject 方法
- r - 根据名称向量(字符向量)重命名数据框中的列
- php - PHP 字符串长度异常以及使用 PHP 搜索 Elasticsearch 时
- javascript - SASS 模板字符串。这是一种使用它们的方法吗?
- ios - 使用可编码模型编码可选值?
- angular - 如何知道它正在使用 async 和 ngFor 加载