为什么 rails 中的 `has_one` 需要外键?

Why does `has_one` in rails require a foreign key?

考虑两个表 FooBar 并考虑基于它们的模型。现在考虑它们之间的一对一关系。

Foo 在其声明中包含 has_one :bar,因此我们可以从 Foo 的对象访问 Bar。但是我不明白的是为什么 Bar 需要引用 Foo?

的外键

如果他们只比较两个 id 来得到结果,不是更容易吗?

我假设比较 id 会有问题,我想知道问题是什么。

您不能假定数据库引擎会将相同的 ID 添加到不同表中的行。您可以(我不推荐)制作具有此类行为的应用程序并使用触发器和约束来实现它,但这将是关系数据库的一种非常有创意(从消极意义上讲)的方法。

id 的问题在于它们存储自动递增的值。让我们考虑 2 tables studentsprojects。 假设一个学生最多可以有 1 个项目。这意味着他可以有或没有项目。

现在考虑 2 个学生 A 和 B。

students table

id name
1   A
2   B

现在projects table

id name
1  P1
2  NULL

在这种情况下,A 有一个名为 P1 的项目,但 B 没有,我们正在创建一个空条目,只是为了维护和匹配项目中存在的记录 ID 与学生,但这在长期。如果一所学校有 1000 名学生,那么我们可能会有 500 行空行供 500 名未从事项目的学生使用。

这就是为什么在 projects table 中添加一列是减少 table 的大小并保持关系的可行解决方案,而且如果您要删除记录,那么新的id 不会与上一个相同,因为 id 是自动递增的。

现在projects table

id name student_id
1  P1    1

也更加可行和灵活。您也可以做到 has_many,因为一个学生也可以从事多个项目。

希望对您有所帮助。