繁体   English   中英

如果Rails仍然可以通过关联访问其他模型的属性,那么拥有外键有什么意义呢?

[英]What's the point of having foreign keys if Rails can access other model's attributes through associations anyways?

我是Rails的初学者(到目前为止一直很喜欢)。 我不确定这是否是一个愚蠢的问题。 据我所知,例如,这样的外键:名为Micropost的模型中的user_id会将微帖子与User模型的ID关联。 像这样:

在此处输入图片说明

railtutorial.org

因此,您可以执行以下操作: <%= micropost.user_id %>以获取创建微博的用户的ID。

但也可以这样做: <%= micropost.user.id %>因为Rails可以通过has_manybelongs_to关联模型。

  • 因此,我想知道,如果Web框架无论如何仍可以通过关联访问其他模型的属性,为什么在Rails应用程序中需要外键?
  • 有必要对它们建立索引并提高数据库性能吗?
  • 还是它们有必要使诸如此类的东西: micropost.user.username起作用?

外键用于幕后使Rails关联正常工作,而没有它们,这些关联就无法工作。 您可以通过将.to_sql附加到关系中来查看此信息,例如:

> Blog.first.articles.to_sql
=> "SELECT `articles`.* FROM `articles`  WHERE `articles`.`blog_id` = 42"

在这种情况下,它使用blog_id外键查询articles关联。

不必索引外键,但这是一个好主意,并且可以提供更好的性能。

因此,我想知道,如果Web框架无论如何仍可以通过关联访问其他模型的属性,为什么在Rails应用程序中需要外键?

外键(以及主键计数器部分)将模型链接在一起。 如果您没有user_id ,您将如何知道它最终与哪个user关联?

有必要对它们建立索引并提高数据库性能吗?

对于性能,我发现这种做法很有帮助。

还是它们有必要使诸如此类的东西:micropost.user.username起作用?

仅在上下文中有必要找到micropost的关联user您需要知道它是哪个user

最关键的事情,了解有关user VS user_id在你的模型是user_id是外键,并且user是一个实例 User (例如,它的模型对象)。

没有user_id ,Rails无法为您选择正确的user

请注意,如果您没有预加载关联,则只需使用用户ID(例如,用于构建URL),使用micropost.user_id速度将比micropost.user.id更快,因为rails不需要实例化User对象只是为了检索ID。

通过调用micropost.user_id,Rails为您提供了microposts表的user_id列的条目。 通过调用micropost.user.id,Rails从micropost中获取user_id列,并“搜索”具有相应ID的Users。 当您没有user_id时,Rails不会对两个表之间的相关性一无所知。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM