如何设计模型以从上或下访问数据层次结构?

How to design models to access data hierarchy from up or bottom?

我知道这个问题听起来很奇怪,但举个例子可以阐明我的想法。

假设我有 2 个 类 EmployeeDepartmentDepartmentArraylist 名员工。这样我就可以访问特定部门的员工。

如果我还需要从 Employee 对象访问员工部门,我该怎么办?我认为将部门也添加到员工对象是一种不好的做法吗?

这是navigability的问题,也是数据库设计中的一个大问题。有几种方法可以实现这一点:

  1. 蛮力。如果您有 Employee,请扫描 Department 以查找它属于哪个(如果有的话)。显然这是非常低效的,并且假设您有一个包含所有可用 Department 的列表。
  2. 索引。在 DepartmentEmployee 对象旁边,维护一个 EmployeeDepartment 的映射,并使用此映射查找反向查找。当然这有一些开销,但最大的担忧是事务性(更新可能会更改索引,然后在更新 Department 之前失败)和一致性(如果客户端在您更新后尝试读取数据会发生什么Department 但在您更新索引之前?)
  3. 双重链接。要求 DepartmentEmployee 类 都相互引用。这很棘手,因为它是在繁琐地构建引用,并且具有相同的事务性和一致性问题。也使得引用变得非常困难final(尽管我认为在这种情况下你不希望这样做)。

因此,在执行此操作之前需要考虑一些问题,但这并非无法克服 - 只需确保在执行此操作之前已考虑线程安全性和容错性。 Doubly-linked lists 是一种使用这种模式的非常常见的数据结构。

您可以像下面这样初始化,但它在多线程应用程序中被认为是不好的做法,但有时对于单线程应用程序中的特定用例是可以接受的。要考虑的一件重要事情是,如果您将 Department 对象作为 this 传递给 Employee 对象,从技术上讲,该对象未完全构建。另一件需要考虑的事情是垃圾收集将如何在这种模式下发挥作用。

public class Department {
  List<Employee> myEmployeeList;

  public Department() {
    int size = 5;
    myEmployeeList.add(new Employee(this));
  }
}

public class Employee {
  Department myDepartment;

  public Employee(Department department) {
    myDepartment = department;
  }
}

您还可以有一个 class,其中包含对 DepartmentEmployee 的引用,并为 Employee 提供该引用。或者在 Employee.

的方法中初始化 Department