我想要一个包含两个表的数据库,如下所示:
Parent
-------
Pk
UgliestChildPk
StrongestChildPk
Child
------
Pk
ParentPk我正在使用SQLite,尽管这可能与它没有太多关系。在我的模型中,父母总是至少有一个孩子,在这种情况下,最丑陋和最强大的将是父母的独生子。我需要能够检索父代的所有子代(通过Child.ParentPk外键)。我还需要能够高效地检索父母最丑陋和最强壮的孩子。我需要能够添加和删除孩子,以及改变哪些是最丑陋和最强大的。
我猜它抛出了一个标志,即父表和子表都引用了对方。有没有更好的方法来完成这类关系?
我可以将IsUgliest和IsStrongest列添加到子表中,但我希望有效地确保每个父表都有且只有一个最丑陋和最强的子级(尽管它们可能是相同的)。我也不希望为了快速检索它们而必须向IsUgliest和IsStrongest列添加索引。我所描述的模式可以防止这种情况,因为Pk列无论如何都是隐式索引的。
有没有更好的方法?有什么建议吗?
发布于 2017-04-11 03:43:38
我更喜欢下面的选项2,因为它是最容易维护和设计逻辑的。
选项1
实现这一点的一种方法是在创建表时指定[strongest] not null unique。然后你将决定如何列出最强的,例如1是最强的。
虽然这将允许您执行所要求的操作,但您需要一些逻辑来重新排列表中的值,以便可以添加或删除其他子项。这将允许您根据您在丑陋/强度分数上设置的升序/降序轻松地重新分配最丑陋的孩子
选项2
第二种方法是仍然使用IsStrongest和IsUgliest列,但将它们的类型设置为Boolean,然后执行检查,以确保在尝试添加新的最丑陋或最强的子级时,只有一个person设置为true。
选项3使用您提供的表结构来快速跟踪父表中最强大和最丑陋的子级。你可能需要另一种方法来跟踪孩子的力量和美丽,这样你就可以很容易地确定谁是父母最丑/最强的孩子
此外,如果您可能有多个父级,则应使用如下所示的链接表
Parent_Child
------------
PCPK
Parent_FK
Child_FKhttps://stackoverflow.com/questions/43331444
复制相似问题