在设计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对象,即使它不是必需的。
在您看来,您应该如何表达或最佳方法?
答案 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)
这不是性能上的差异,实际上只有一个比另一个更容易实现。