SQLite数据库,其中两个表互相引用

时间:2017-04-10 19:25:39

标签: sql database sqlite

我想拥有一个包含两个表的数据库,如下所示:

Parent
-------
Pk
UgliestChildPk
StrongestChildPk


Child
------
Pk
ParentPk

我正在使用SQLite,尽管这可能并不重要。 在我的模型中,父母总是至少有一个孩子,在这种情况下,最丑的孩子和最强的孩子将是父母唯一的孩子。 我需要能够检索所有父母的孩子(通过Child.ParentPk外键)。我还需要能够有效地找回父母最丑陋和最强壮的孩子。 我需要能够添加和删除子项,以及更改哪些是最丑陋和最强的。

我收集它会抛出一个标志,父表和子表都互相引用。有没有更好的方法来实现这些关系?

我可以将一个IsUgliest和IsStrongest列添加到Child表中,但我想有效地确保每个Parent都有一个且唯一一个最丑陋和最强的子(尽管它们可能是相同的)。 我也不想为IsUgliest和IsStrongest列添加索引,以便快速检索它们。我所描述的模式阻止了,因为无论如何都会隐式索引Pk列。

有更好的方法吗? 有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我更喜欢下面的选项2,因为它最容易维护和制作逻辑。

选项1

实现此目的的一种方法是在表创建中指定[strongest] not null unique。然后,您将决定如何列出最强的列表,例如: 1是最强的。

虽然这样可以让你按照自己的要求进行操作,但是需要一些逻辑来重新排列表中的值,以便添加或删除其他子项。这将允许您根据您在丑陋/力量分数上设置的升序/降序轻松地重新分配最丑陋的孩子

选项2

执行此操作的第二种方法是仍然使用IsStrongest和IsUgliest列,但将其类型设置为布尔值,然后执行检查以确保在尝试时只有一个人设置为true添加一个新的最丑或最强的孩子。

选项3 使用您提供的表结构可以快速跟踪父表中最强和最丑的子项。您可能需要另一种方法来跟踪孩子的力量和美丽,以便您可以轻松确定谁是父母最丑陋/最强壮的孩子

<强>另外 如果您有可能拥有多个父级,则应使用看起来像这样的链接表

Parent_Child
------------
PCPK
Parent_FK
Child_FK