Ruby on rails 为什么rails中的“has_one”需要外键? 考虑两个表:代码> Foo和Bar ,并考虑基于它们的模型。现在考虑它们之间的一一对应关系。

Ruby on rails 为什么rails中的“has_one”需要外键? 考虑两个表:代码> Foo和Bar ,并考虑基于它们的模型。现在考虑它们之间的一一对应关系。,ruby-on-rails,ruby-on-rails-4,activerecord,Ruby On Rails,Ruby On Rails 4,Activerecord,Foo包含的声明中有一个:bar,这样我们就可以从Foo的对象中访问bar。但我不明白的是为什么Bar需要一个外键引用Foo 如果他们只是比较两个ids来得到结果,难道不是更容易吗 我假设在比较ids时会出现问题,我想知道问题是什么。您不能假设DB引擎会将相同的id添加到不同表中的行中。你可以(我不建议)用这样的行为制作一个应用程序,并用触发器和约束实现它,但这将是一种非常有创造性的(从消极的意义上说)关系数据库方法 ID的问题是它们存储自动递增的值。让我们考虑2个表学生< /代码>和项目< /

Foo
包含
的声明中有一个:bar
,这样我们就可以从
Foo
的对象中访问
bar
。但我不明白的是为什么
Bar
需要一个外键引用
Foo

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


我假设在比较
id
s时会出现问题,我想知道问题是什么。

您不能假设DB引擎会将相同的id添加到不同表中的行中。你可以(我不建议)用这样的行为制作一个应用程序,并用触发器和约束实现它,但这将是一种非常有创造性的(从消极的意义上说)关系数据库方法

ID的问题是它们存储自动递增的值。让我们考虑2个表<代码>学生< /代码>和<代码>项目< /代码>。 让我们假设一个学生最多可以有一个项目。这意味着他要么有一个项目要么没有

现在考虑2名学生A & B

学生表

id name
1   A
2   B
id name
1  P1
2  NULL
id name student_id
1  P1    1
现在
项目表

id name
1   A
2   B
id name
1  P1
2  NULL
id name student_id
1  P1    1
在这种情况下,A有一个名为P1的项目,但B没有,我们创建一个空条目只是为了维护项目中记录的id并与学生进行匹配,但从长远来看这是不可行的。如果一所学校有1000名学生,那么我们可能会有500个空行供500名没有参与项目的学生使用

这就是为什么在
projects table
中添加列是一个可行的解决方案,可以减少表的大小并维护关系,而且如果要删除记录,则新id将与前一个id不同,因为id是自动递增的

现在
项目表

id name
1   A
2   B
id name
1  P1
2  NULL
id name student_id
1  P1    1
更具可行性和灵活性。你可以让它有很多,因为一个学生也可以从事多个项目

我希望这对你有帮助。

这应该会有帮助