2

我正在读一本书,它谈到了 a Userhas some more UserDetail,因此UserDetail将有一个user_id指向 Users 表的内容。我有点忘记了,在Users表中有一个字段user_detail_id指向 UserDetail 记录是否有帮助?

在 Ruby on Rails 中也是如此,Users表没有user_detail_id,但UserDetail表有user_id. 而User模型用has_one :user_detail,而UserDetail模型用belongs_to :user

有点道理,如果是一对多关系,那么在“Many”一侧,我们有一个foreign_id指向“One”一侧,但“One”一侧不需要指向“多”的一面,所以看起来一对一的也不需要指向双向,因为一侧就足够了。

4

4 回答 4

2

在 "Many" 端,我们有一个 foreign_id 指向 "One" 端,但 "One" 端不需要指向 "Many" 端,所以看起来一对一没有也不需要指向两边,因为一侧就足够了。

你永远不会在关系的两边都实现外键——你永远不能在不禁用约束的情况下插入数据,因为约束要求信息同时存在于两个表中。必须将两个表之一视为父实体,其中子实体将依赖 parent_id 来实现引用完整性......

但是我认为您已经明白为什么您通常不以一对一的关系对表格进行建模。它通过将主键复制为外键(至少)并包含外键约束作为额外的包袱,从而产生了毫无意义的开销。为了解决性能问题,采用了一对一的表格;除非存在性能问题,否则它是过早的优化......

于 2010-09-05T18:24:22.597 回答
2

这不是一个好主意,如果你想删除一行,你会怎么做?您需要禁用约束!

于 2010-09-05T15:58:12.407 回答
2

没错,就外键而言,只需为一个方向设置关系。请注意,Rails 中的 ActiveRecord 关联允许您从任一端遍历关联。例如:

@user.user_detail

# Or
@user_detail.user
于 2010-09-05T15:58:23.437 回答
1

在一对一的情况下,您可以将其完全视为一对多,只是“多”部分始终是“一”。话虽如此,在“多”端拥有外键就足够了,并且不需要任何双重指向。就这么简单。

于 2010-09-05T15:58:37.113 回答