2009-11-13 60 views
1

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

class Employee 
{ 
    int ID { get; set; } 

    String Name { get; set; } 

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

--- OR ---

class Employee 
{ 
    int ID { get; set; } 

    String Name { get; set; } 

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

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

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

回答

3

大多数ORM框架将处理与第一种情况等效的第二种情况。以Hibernate为参考例子,他们会毫不含糊地告诉您永远不会做第一个选项。实际上,他们对此很嗤之以鼻。

事实上,我认为第一个选项在技术上不会被视为ORM,因为关系是在您的OOP代码中的ID级别处理的。 Hibernate(与大多数其他人一样)具有延迟加载,这意味着您可以加载您的Employee并且它不会获取Department。但是,如果你说employee.getDepartment(),它会在那时执行简单的select语句来获取部门数据。

这也恰好可以在映射时间或查询时间进行配置,所以如果您有一些用户知道需要部门的用例,则可以通过告诉它将Employee和Department一个连接查询。

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

1

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

2

你忘记了相关的项目可以加载懒惰。

也就是说,创建Employee对象时,不必填充Department字段。当调用get访问器时可以填充这个值。

相关问题