Какой смысл иметь внешние ключи, если Rails все равно может получить доступ к атрибутам другой модели через ассоциации? - PullRequest
1 голос
/ 30 января 2012

Я новичок в Rails (и до сих пор люблю его).Я не уверен, что это глупый вопрос.Насколько я знаю, внешний ключ, например, такой: user_id в модели с именем Micropost будет связывать микросообщение с идентификатором модели User.Например:

enter image description here

railtutorial.org

Таким образом, вы можете сделать это: <%= micropost.user_id %>, чтобы получить идентификатор пользователя, которыйсоздал микросообщение.

Но также может сделать это: <%= micropost.user.id %> из-за способности Rails связывать модели через has_many и belongs_to.

  • Так что мне интересно, почемувнешние ключи необходимы в приложениях Rails, если веб-каркас может в любом случае получать доступ к атрибутам других моделей через ассоциации?
  • Нужно ли их индексировать и повышать производительность базы данных?
  • Или они необходимы, чтобы что-то былокак это: micropost.user.username может работать?

Ответы [ 4 ]

2 голосов
/ 30 января 2012

Внешние ключи используются под капотом, чтобы заставить ассоциации Rails работать, и эти ассоциации не будут работать без них.Это можно увидеть, подключив .to_sql к Relation, например:

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

В этом случае он использует внешний ключ blog_id для запроса ассоциации articles.

Itнет необходимости индексировать внешние ключи, но это хорошая идея, которая дает лучшую производительность.

2 голосов
/ 30 января 2012

Итак, мне интересно, зачем нужны внешние ключи в приложениях Rails, если веб-фреймворк в любом случае может обращаться к атрибутам других моделей через ассоциации?

Внешние ключи (вместе со счетной частью первичного ключа) - это то, что связывает модели вместе. Если бы у вас не было user_id, как бы вы узнали, с каким user он в конечном итоге связан?

Нужно ли их индексировать и повышать производительность базы данных?

Я считаю эту практику полезной в отношении производительности.

Или они нужны, чтобы что-то вроде этого: micropost.user.username могло работать?

Необходимо только в контексте, чтобы найти micropost, связанный user, вам необходимо знать, какой user это.

1 голос
/ 30 января 2012

Ключевая вещь, которую нужно понять о user против user_id в вашей модели, заключается в том, что user_id - это внешний ключ, а user - это экземпляр из User (например, это объект модели).

Без user_id, рельсы не могут сделать правильный user для вас.

Обратите внимание, что если вы не предварительно загружаете ваши ассоциации, если вам нужен только идентификатор пользователя (скажем, для создания URL-адреса), использование micropost.user_id будет быстрее, чем micropost.user.id, поскольку rails не нужно создавать экземпляр объекта User только для получения идентификатора.

0 голосов
/ 30 января 2012

Вызывая micropost.user_id, Rails дает вам запись в столбце user_id таблицы microposts.Вызывая micropost.user.id, Rails берет столбец user_id из micropost и «ищет» пользователей с соответствующим идентификатором.Когда у вас нет user_id, Rails ничего не знает о корреляции между двумя таблицами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...