我正在寻找创建一系列表关系,它们将互斥,共同穷举,即形成给定集合的分区。例如,假设您有以下关系:
动物是(或仅是)猫或狗。
狗有名字和喜欢的玩具。猫有名字和喜欢的食物。
尝试在SQL中为这种关系建模的第一个方法是,将一个带有animals
列的animalId
表和一个带有dogs
的{{1}}表以及dogId
列,其中favoriteToy
具有对dogId
的外键引用。然后,您可能有一个带有animalId
和cats
列的catId
表,其中favoriteFood
具有对catId
的外键引用。
但是,这有两个问题,一些似乎可以解决,有些没有。
animalId
的{{1}}和dogId
(我认为这不是基本问题,因为我可以在动物中添加两个成员的附加列由猫和狗复制并用于形成复合外键的枚举)catId
或animalId
中都没有的animalId
中添加一个animals
。另一方面,我可以将所有内容标准化为具有catId
和dogId
列的单个animals
表,但这似乎没有约束,即这些列中只有一个必须不为空。
简而言之,我似乎可以确保相互排他,但不能确保集体排他性,或者我可以确保集体排他性,但不能确保相互排他。还有另一种方法可以同时给我和我吗?看来您可能需要某种循环依赖,但是我不确定是否有一种很好的方法可以在不涉及不必要的favoriteFood
的情况下做到这一点(这似乎是一种治愈方法,胜于疾病) )。