考虑两个表Foo
和Bar
并考虑基于它们的模型。现在考虑一下它们之间的一对一关系。
Foo
的声明中包含has_one :bar
,以便我们能够从Bar
的对象访问Foo
。但是我不明白的是为什么Bar
需要引用Foo
的外键?
如果他们只比较两个id
来获得结果,这会更容易吗?
我假设比较两个id
会出现问题,我想知道问题所在。
答案 0 :(得分:0)
您不能假定数据库引擎会将相同的ID添加到不同表中的行。您可以(我不建议)制作具有这种行为的应用程序,并使用触发器和约束来实现它,但这对于关系数据库来说是一种非常有创意(在负面意义上)的方法。
答案 1 :(得分:0)
id的问题是它们存储自动递增的值。让我们考虑2个表students
和projects
。
假设一个学生最多可以有一个项目。这意味着他可以有一个项目,也可以没有。
现在考虑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
中添加一列是减小表的大小并维护关系的可行解决方案的原因,并且如果您要删除一条记录,那么新的ID将不会相同因为前一个ID是自动递增的。
现在projects table
id name student_id
1 P1 1
更加可行和灵活。您也可以设置has_many,因为一个学生也可以从事多个项目。
希望对您有帮助。