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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何避免将重复对象加载到主内存中?相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

如果您有任何疑问,请告诉我。

答案

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

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

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实例。

另一答案

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

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

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

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

以上是关于如何避免将重复对象加载到主内存中?的主要内容,如果未能解决你的问题,请参考以下文章

JPA:如何避免简单地加载对象,以便将其 ID 存储在数据库中?

如何避免将大文件重复加载到 python 脚本中?

需要一种有效的方法来避免使用 Laravel 5 重复代码片段

如何避免为页面加载和 DOM 更改重复此特定代码?

将数据从全局加载到共享内存时如何避免银行冲突

如何将 winform 子表单动态嵌入到主 winform 的选项卡控件中?