Лучшая практика: ленивая загрузка или получение ВСЕХ свойств - PullRequest
0 голосов
/ 28 марта 2012

У меня вопрос, когда дело доходит до отложенной загрузки.Для этого я использую LinQ для NHibernate, но я предполагаю, что он также будет применяться к другим методологиям LINQ to XX.

Представьте таблицу Пользователь со столбцом:

ID Имя АдресПароль (для этого примера: простой, не хэшированный)

И представьте Роль Таблица:

Идентификационное имя

И, конечно, есть многотаблица-ко-многим UserRole (с дополнительной информацией, такой как CreateDate).

Когда вы хотите получить только имена из ролей изопределенный пользователь вы можете сделать это через eager-loading с помощью следующего запроса:

var roles = session.Query<User>().FetchMany(u => u.UserRoles)
                                .ThenFetch(ur => ur.Role)
                                .Single(u => u.Id == userId)
                                .UserRoles.Select(ug => new { ug.Role.Name } );

Lazy-loading :

var roles = session.Query<User>().Single(u => u.Id == userId)
                                .UserRoles.Select(ug => new { ug.Role.Name } );

Преимущества быстрой загрузки: вместо 2 или 3 вызовов в базу данных каждый раз, когда у вас есть только один вызов Недостаток быстрой загрузки: даже если вы говорите, что ТОЛЬКО хотите вернуть имя, сам запросприведет к получению ВСЕХ свойств всех включенных таблиц из базы данных (включая конфиденциальную информациюкак в нашем примере паролей), и когда он окажется внутри вашего кода, он отфильтрует только имя.

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

Заранее спасибо,

Питер

1 Ответ

0 голосов
/ 28 марта 2012

Относительно того, использовать или нет ленивую загрузку или готовую загрузку. Это действительно зависит от того, что ваши пользователи будут делать чаще. Если ваши пользователи в конце концов дотронутся до вашей ссылки на карту более чем на 50% (* я не уверен в том, что такое хороший процент, но давайте пойдем с этим) того времени, то вы должны идти с энергичной загрузкой. В противном случае, вы должны использовать отложенную загрузку. Процент, вероятно, должен варьироваться в зависимости от стоимости, которую несут нагрузки.

Тем не менее, я бы сказал, что следует придерживаться поведения по умолчанию большинства ORM (отложенная загрузка), если у вас действительно нет проблем. Придерживайтесь первого девиза KISS . :)

Это как минимум два моих цента:)

...