在设计ORM时,表现关系的最佳方法是什么?

时间:2009-11-13 04:04:29

标签: design-patterns oop orm domain-driven-design

在设计ORM时,表现性能的最佳方法是什么?我的意思是,在以下两种方法中,哪种方法最好考虑性能?

class Employee
{
     int ID { get; set; }

     String Name { get; set; }

     int DepartmentID { get; set; } //This approach uses DepartmentID
}

---或---

class Employee
{
     int ID { get; set; }

     String Name { get; set; }

     Department Department { get; set; } //This approach uses Department class 
}

从我的角度来看,第二种方法很好。它也是面向对象的。这应该是ORM的主要目的;将关系从RDBMS转换为面向对象。但是这样做,我们需要在一个员工中加载整个Department对象,即使它不是必需的。

在您看来,您应该如何表达或最佳方法?

3 个答案:

答案 0 :(得分:3)

大多数ORM框架将处理第二种情况,其性能与第一种情况相同。以Hibernate作为参考示例,他们会毫不含糊地告诉你永远不会做第一个选项。实际上,他们对此很嗤之以鼻。

事实上,我认为第一个选项在技术上不会被视为ORM,因为关系是在您的OOP代码中的ID级别处理的。

Hibernate(和其他大多数人一样)都有延迟加载,这意味着你可以加载你的Employee而且它不会获取部门。但是如果你说employee.getDepartment(),那么它将在那时去做简单的select语句来获取部门数据。

这也恰好可以在映射时或查询时配置,所以如果你有一些用例,你知道你需要部门,你可以通过告诉它在一个中获取Employee和Department来保存第二个SQL调用。加入查询。

查看Hibernate的"Small Primer on Fetch Strategies"了解更多信息。

答案 1 :(得分:2)

您忘记了可以懒惰地加载相关项目。

也就是说,当您创建Employee对象时,您不必填充Department字段。可以在调用get访问者时填充。

答案 2 :(得分:1)

这不是性能上的差异,实际上只有一个比另一个更容易实现。