Sql 为什么hasOne关系中的外键需要位于引用表中?
为什么Laravel雄辩地坚持hasOne关系中的外键必须在引用表中,而不是在父表中 我要求大家普遍理解/充实 例如,根据Laravel文档:如果一个Sql 为什么hasOne关系中的外键需要位于引用表中?,sql,laravel,eloquent,Sql,Laravel,Eloquent,为什么Laravel雄辩地坚持hasOne关系中的外键必须在引用表中,而不是在父表中 我要求大家普遍理解/充实 例如,根据Laravel文档:如果一个用户有一个电话,那么电话型号应该有一个用户id外键 这似乎需要数据库做更多的工作:在Phones表中查找user\u id,而user模型上已经存在phone\u id 我假设以下三个原因都适用-还有其他原因可以这样构建吗? 它可以利用已经编写好的查找逻辑,并且有很多关系(很明显,为什么需要这样做) 该关系可以很容易地“迁移”到具有多个关系的数据
用户
有一个电话
,那么电话
型号应该有一个用户id
外键
这似乎需要数据库做更多的工作:在Phones
表中查找user\u id
,而user
模型上已经存在phone\u id
我假设以下三个原因都适用-还有其他原因可以这样构建吗?
- 它可以利用已经编写好的查找逻辑,并且有很多关系(很明显,为什么需要这样做)
- 该关系可以很容易地“迁移”到具有多个关系的数据库
- 它保证只要存在关系,
模型实际上也存在。(否则,手机
模型中的User
可能会指向phone\u id
表中不存在的条目。)Phones
hasOne
关系和belongsTo
关系
在您的示例中,如果A
具有b_id
列,则A
属于b
如果B
有一个a\u id
列,则a
有一个或多个B
取决于B
应该有多少个
资料来源:
Laravel有
hasOne
关系和belongsTo
关系
在您的示例中,如果A
具有b_id
列,则A
属于b
如果B
有一个a\u id
列,则a
有一个或多个B
取决于B
应该有多少个
资料来源:
这似乎是数据库要做的更多工作:在Phones表中查找用户id,而不是用户模型中已经存在一个phone id
你在这里提到的是所谓的归属关系,实际上是HasOne或HasMany的倒数。这意味着,如果用户有一部或多部手机,则手机会通过User\u id
外键自动属于用户。这也意味着一部手机永远只属于一个用户
HasOne和HasMany之间的相似性是非常正确的,因为它们使用外键的方式完全相同。事实上,Eloquent的唯一真正区别在于,对于HasOne,它返回引用表中的第一个匹配项,而不是HasMany中的所有可用匹配项
请注意,您的第三点并不完全正确,因为phones
表中的user\u id
尽可能不指向users
中的现有条目,除非数据库中存在强制您使用外键指向现有条目的约束
这似乎是数据库要做的更多工作:在Phones表中查找用户id,而不是用户模型中已经存在一个phone id
你在这里提到的是所谓的归属关系,实际上是HasOne或HasMany的倒数。这意味着,如果用户有一部或多部手机,则手机会通过User\u id
外键自动属于用户。这也意味着一部手机永远只属于一个用户
HasOne和HasMany之间的相似性是非常正确的,因为它们使用外键的方式完全相同。事实上,Eloquent的唯一真正区别在于,对于HasOne,它返回引用表中的第一个匹配项,而不是HasMany中的所有可用匹配项
请注意,您的第三点并不完全正确,因为
phones
表中的user\u id
尽可能不指向users
中的现有条目,除非数据库中存在约束,强制您的外键指向现有条目。有点密集读取,但请检查。您所描述的与其说是一个Laravel问题,不如说是一个数据设计问题。它的缺点是,如果您在同一个表中有外来id,那么它“属于另一个记录”,但是如果本地键在一个外来表中,那么该记录“有一个/多个其他记录”。您所描述的与其说是一个Laravel问题,不如说是一个数据设计问题。简而言之,如果您在同一个表中有外来id,则它“属于另一条记录”,但如果本地密钥位于外来表中,则该记录“具有一条/多条其他记录”。这也意味着一部手机将只属于一个用户。这是对为什么会这样做的精明洞察。这也意味着一部手机永远只属于一个用户。这是对为什么会这样做的精明洞察。谢谢。