我们说我有4个表:tbl_dogs
,tbl_cats
,tbl_birds
和tbl_fish
,每个表都有自己的_Id
列,当然..我想创建在任何这些表之间具有多对多关系的能力。在我的脑海中,我想象了一个tbl_relationships
表,其中包含两列animal1_id
和animal2_id
,我可以将条目设为cat_12 | dog_3
,bird_1 | dog_9
,{{1这是一个2部分问题:
fish_8 | cat_4
和animal1_id
作为列,我想要animal2_id
和parent_animal
,以便当我去看{{1}时1}},我可以将child_animal
作为fish
的所有child_animal
记录以及具有该fish
的所有parent_animal
记录拉出来一个parent_animal
?非常感谢任何帮助,谢谢!
答案 0 :(得分:0)
任何关系数据库都无法实现。实体框架不是重点。必须对特定表进行外键。周期。
在Python框架中,Django通过其通用内容类型来处理你正在寻找的东西,但它更像是一个黑客而不是任何东西。对于每个通用相关项,设置两列:一列用于对象的类型,另一列用于对象的id。没有外键,因为在这种情况下,外键是不可能的。
在框架代码中,为了实现相关对象,他们然后使用对象id向正确的表(基于对象类型)发出查询。但是,这在Python中比
如果你有充分的动力,你可以在C#技术上达到同样的目的,但这将是一个完全手动的努力。实体框架在这里没有任何帮助。你还需要使用反射来最终实现正确的类型,反射既是后期的痛苦又是非常低效的(慢)。
也就是说,由于这里的特定场景涉及所有特定类型的事物,动物,你可以通过继承来实现你正在寻找的东西。换句话说,您可以创建Animal
实体,然后让Dog
,Cat
,Bird
,Fish
等继承自{{1} }}。然后,您可以创建Animal
的外键并与其中任何一个进行交互。但是,您只能以Animal
s与它们进行互动,而不是像Animal
那样具体。{/ p>
答案 1 :(得分:0)
如果您需要一个只有两列的矩阵表,并且您需要将每种动物类型放在自己的表中,那么Chris Pratt的答案就是简洁。
如果你可以使用两列以上但是被迫坚持使用单独的动物表,我会尝试在矩阵表中为每个动物表创建一个列,并将此矩阵表变成一个巨大的多列圆形怪物。
如果您在矩阵表中限制为两列,但可以根据您要查找的父/子组合来定位矩阵表,那么我将设置十二个矩阵表,并将它们中的每一个用于其中一个每对动物表可能的动物组合。如果动物表的数量实际上要大得多,显然你会遇到问题。
如果动物表本身都具有相同的列(类型/内容/要求),则可能存在解决方法。您可以将所有动物放在一个表格中,其中的标识符表示它是什么类型的动物。这通常是附加到动物类型查找表的外键。然后你可以把你的矩阵表作为父列和子列,因为它们只与一个其他表有明确的关系('mass animal'表;父和子都会指向它的PK)。
前一段的更优雅可能的解决方法(我还没有机会使用它,所以我对它的实现非常朦胧,对于陷阱而言)是Inheritance。继承允许您组合几个表,这些表保存几乎相同(在字段和数据类型方面)的数据集合,并且能够通过鉴别器区分这些集合。这样,根据前一段,你可以有一个带有一个鉴别器的Animals表,它指示每一行是什么(cat,dog等),以及一个矩阵表,其中父和子指向的ID是动物表。由于矩阵表中的每一列都与唯一表(而不是多个表)有关联,因此可以很好地解决这个问题。