为什么 rails 中的 `has_one` 需要外键?
Why does `has_one` in rails require a foreign key?
考虑两个表 Foo
和 Bar
并考虑基于它们的模型。现在考虑它们之间的一对一关系。
Foo
在其声明中包含 has_one :bar
,因此我们可以从 Foo
的对象访问 Bar
。但是我不明白的是为什么 Bar
需要引用 Foo
?
的外键
如果他们只比较两个 id
来得到结果,不是更容易吗?
我假设比较 id
会有问题,我想知道问题是什么。
您不能假定数据库引擎会将相同的 ID 添加到不同表中的行。您可以(我不推荐)制作具有此类行为的应用程序并使用触发器和约束来实现它,但这将是关系数据库的一种非常有创意(从消极意义上讲)的方法。
id 的问题在于它们存储自动递增的值。让我们考虑 2 tables students
和 projects
。
假设一个学生最多可以有 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,因为一个学生也可以从事多个项目。
希望对您有所帮助。
考虑两个表 Foo
和 Bar
并考虑基于它们的模型。现在考虑它们之间的一对一关系。
Foo
在其声明中包含 has_one :bar
,因此我们可以从 Foo
的对象访问 Bar
。但是我不明白的是为什么 Bar
需要引用 Foo
?
如果他们只比较两个 id
来得到结果,不是更容易吗?
我假设比较 id
会有问题,我想知道问题是什么。
您不能假定数据库引擎会将相同的 ID 添加到不同表中的行。您可以(我不推荐)制作具有此类行为的应用程序并使用触发器和约束来实现它,但这将是关系数据库的一种非常有创意(从消极意义上讲)的方法。
id 的问题在于它们存储自动递增的值。让我们考虑 2 tables students
和 projects
。
假设一个学生最多可以有 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,因为一个学生也可以从事多个项目。
希望对您有所帮助。