Могут ли модели Rails иметь слишком много ассоциаций? - PullRequest
2 голосов
/ 27 августа 2010

Извинения, если этот вопрос немного глупый, но есть ли какие-либо негативные последствия, если приложение имеет модель или модели с многочисленными ассоциациями?Например, для сложного приложения, для которого требуется модель User (например, сайт социальной сети), вполне вероятно, что модель может иметь более 15 ассоциаций (has_many :posts, has_many :messages, has_many :photos, has_many :friends и т. Д.).Если одна модель тесно связана с другими, оказывает ли это какое-либо негативное влияние на производительность приложения?И если да, то как лучше всего минимизировать проблемы?

Ответы [ 2 ]

5 голосов
/ 27 августа 2010

Ассоциация между моделями в Rails на самом деле просто манипулирует значениями id за кулисами.Это довольно высокопроизводительные операции, особенно если вы потратили время на настройку отношений с внешним ключом, если ваша БД это поддерживает.ActiveRecord также не загружает ничего, если вы не попросите об этом, поэтому обычно они будут переводиться как JOIN для SQL-сервера, только если вы действуете на этих отношениях.Если в вашем примере созданы друзья, ActiveRecord автоматически установит для вас столбец user_id.Это все, что входит в has_many ассоциацию.

Преждевременная оптимизация - корень всего зла .Не беспокойтесь об этом, пока не установите узкое место с профилированием.

3 голосов
/ 27 августа 2010

Ну, первый совет, который я мог бы предложить, это быстро создать прототип и посмотреть, как он работает.

Что касается ограничения ассоциаций, ActiveRecord по умолчанию использует ленивые отношения. Таким образом, загрузка пользователя не будет автоматически загружать сообщения, сообщения, фотографии, друзей и т. Д., Пока вы не попросите их. Обычно это очень хорошо для вас, так как вам, вероятно, не нужны все их фотографии на странице сообщения.

Вот ссылка с некоторыми советами по оптимизации ActiveRecord для более подробной информации: http://www.ibm.com/developerworks/web/library/wa-rails3/

...