【问题标题】:Best-practise: lazy-loading or getting ALL properties最佳实践:延迟加载或获取所有属性
【发布时间】:2012-03-28 17:20:45
【问题描述】:

我有一个关于延迟加载的问题。为此,我使用 LinQ to NHibernate,但我认为它也适用于其他 LINQ to XX 方法。

想象一个带有列的用户表格:

身份证 姓名 地址 密码(本例中:普通密码,未散列)

想象一个角色表:

身份证 名称

当然,还有多对多表 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 } );

延迟加载

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

Eager-loading 的优点:每次只有 1 次调用时,无需对数据库进行 2 或 3 次调用 急切加载的缺点:即使您说您只希望返回名称,查询本身也会导致从数据库中获取所有包含表的所有属性(包括我们示例密码中的敏感信息),并且一旦进入您的代码它只会过滤名称。

任何人都可以就这两个中的哪一个是最佳实践提供一些建议吗?或者有没有其他方法可以在不加载所有属性的情况下进行预加载。请不要就使用存储过程提出建议。

提前致谢,

彼得

【问题讨论】:

    标签: nhibernate lazy-loading eager-loading


    【解决方案1】:

    关于是否使用延迟加载或急切加载。这实际上取决于您的用户将更频繁地做什么。如果您的用户最终接触到您​​的映射参考超过 50%(*我不确定一个好的百分比是多少,但让我们继续吧),那么您应该使用急切加载。否则,您应该使用延迟加载。该百分比可能会根据负载产生的成本而有所不同。

    但是,除非您确实遇到问题,否则我会说使用大多数 ORM(延迟加载)的默认行为。坚持KISS 第一个座右铭。 :)

    这至少只是我的两分钱:)

    【讨论】:

    • 我理解你的想法。但是安全呢?如果 - 例如银行帐号 - 从数据库发送给客户,而客户实际上并不需要它,这有多危险?数据库和客户端之间的数据传输不安全吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多