如何避免将重复的对象加载到主内存中?

时间:2018-02-24 22:08:30

标签: java c# sql oop design-patterns

假设我使用的是SQL,我有两个表。一个是公司,另一个是员工。当然,员工表中有一个外键引用他或她工作的公司。

当我在我的代码中使用此数据集时,我想知道每个员工的工作方式。我想到的最好的解决方案是将一个实例变量添加到名为Company(类型为Company)的Employee类中。此变量可能是延迟加载的,也可能是手动填充的。

问题是许多员工在同一家公司工作,因此每个员工最终都会不必要地存储完全相同的公司对象副本。如果需要更新公司的某些内容,这可能是一个大问题。此外,公司对象自然会存储其员工列表,因此我也可能遇到无限循环引用的问题。

我应该做些什么?似乎面向对象的设计在关系数据方面效果不佳。

这更像是一个设计/原则问题,我没有任何具体的代码,我只是想朝着正确的方向迈出一步!

如果您有任何问题,请与我们联系。

2 个答案:

答案 0 :(得分:0)

不要尝试将业务对象设计为镜像数据库架构 设计对象以满足您的业务需求。

例如,如果您需要显示没有公司信息的员工列表,您可以创建仅从数据库检索所需信息到对象的函数

public class EmployeeBasicInfo
{
    public int Id;
    public string Name;
}

对于下一个要求,您需要一份包含完整信息的员工列表 - 然后您将拥有从数据库中检索完整数据的功能

public class Employee
{
    public int Id;
    public string Name;
    public int Age;
    public CompanyBasicInfo Company;
}

Company类不会有员工集合,但只有Employee类所需的信息。

public class CompanyBasicInfo 
{
    public int Id;
    public string Name;
}

当然,在最后一种情况下,您最终会得到一堆具有相同数据的不同Company个对象。但它应该是好的。

如果您担心在不同对象中使用相同的数据副本会导致性能问题,那么在您将加载数百万员工之前不会 - 这应该是应用程序设计中出现问题的好兆头。

当然,在您实际需要加载数百万员工的情况下 - 那么您可以使用加载员工的方法 - 首先加载Map<int, Company>中的所有公司,然后在加载员工时,您将引用相同的员工的Company个实例。

答案 1 :(得分:0)

在数据库中,主键是特定记录的标识符;在正在运行的应用程序中,引用是对象的标识符。 (在更低级别,内存地址定位表示该对象的字节。)

初始化对象并将其分配给变量时,您正在使用该变量来标识内存中的对象,以便以后可以访问它。在对象中保留类似标识符的属性只是弥合关系数据模型和对象模型之间差距的必要条件。

  

我真的是唯一遇到这个问题的人吗?必须有一些方法可以做到这一点,而不依赖于懒惰加载每个属性。

这个问题以前已经解决过很多次了。您可以使用现有的任何已建立的ORM库来避免重新发明轮子。