Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite数据库,其中两个表相互引用_Sql_Database_Sqlite - Fatal编程技术网

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

SQLite数据库,其中两个表相互引用,sql,database,sqlite,Sql,Database,Sqlite,我想要一个包含两个表的数据库,如下所示: Parent ------- Pk UgliestChildPk StrongestChildPk Child ------ Pk ParentPk 我正在使用SQLite,尽管这可能不太重要。 在我的模型中,父母总是至少有一个孩子,在这种情况下,最丑和最强壮的孩子将是父母的独生子。 我需要能够检索父级的所有子级(通过Child.ParentPk外键)。我还需要能够有效地找回父母最丑、最强壮的孩子。 我需要能够添加和删除孩子,以及改变哪些是最丑和最

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

Parent
-------
Pk
UgliestChildPk
StrongestChildPk


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

我推测它抛出了一个标志,即父表和子表都相互引用。有没有更好的方法来完成这些关系

我可以在子表中添加一个最丑和最强壮的列,但我希望有效地确保每个父表都有一个且只有一个最丑和最强壮的子表(尽管它们可以是相同的)。 我也不想为了快速检索而必须向最丑和最强壮的列添加索引。我描述的模式阻止了这种情况,因为Pk列无论如何都是隐式索引的

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

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

选项1

实现这一点的一种方法是在表创建中指定
[strong]NOTNULL unique
。然后,您将决定如何列出最强的,例如1是最强的

尽管这将允许您按要求执行操作,但您需要一些逻辑来重新排列表中的值,以便添加或删除其他子项。这将允许您根据您设置的丑陋/力量分数的升序/降序,轻松地重新分配最丑陋的孩子

选项2

第二种方法是仍然使用IsStrongest和ISUGLEST列,但将其类型设置为Boolean,然后在尝试添加新的最丑或最强壮的子级时,执行检查以确保只有一个人设置为
true

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

另外 如果您有可能拥有多个父级,则应使用如下所示的链接表

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

如果你想确保没有任何“一般”的孩子(不是最强壮的,也不是最丑的),你必须在替换他们时做一个检查。我的意思是:我想替换父母X中最强壮的孩子。对其他人来说,“老”孩子最强壮/最丑吗?如果不是,则可以删除它并插入新的子项。如果旧的子项“仍然有用”(对于同一个或另一个父项来说,它是最强/最丑的子项),则只需更新父项,而不删除该子项。或者使用另一种方法,您可以更新父级,然后删除所有“无用”的子级。您建议的模式很好。为什么你说“我收集它抛出了一个标志,表明父表和子表都相互引用”?人们似乎不赞成这种结构,部分原因是我认为它在尝试使用外键约束时造成了一种不可能的鸡/蛋情况。我喜欢这种表设计。所有列都不应为空(每个父项都有一个子项,每个父项都有一个最强的子项,每个父项都有一个最丑的子项,每个子项都有一个父项),并且外键约束必须延迟()。在我看来,这应该行得通。我忘记了延迟外键约束,这很有帮助!