如何设计模型以从上或下访问数据层次结构?
How to design models to access data hierarchy from up or bottom?
我知道这个问题听起来很奇怪,但举个例子可以阐明我的想法。
假设我有 2 个 类 Employee
和 Department
。 Department
有 Arraylist
名员工。这样我就可以访问特定部门的员工。
如果我还需要从 Employee
对象访问员工部门,我该怎么办?我认为将部门也添加到员工对象是一种不好的做法吗?
这是navigability的问题,也是数据库设计中的一个大问题。有几种方法可以实现这一点:
- 蛮力。如果您有
Employee
,请扫描 Department
以查找它属于哪个(如果有的话)。显然这是非常低效的,并且假设您有一个包含所有可用 Department
的列表。
- 索引。在
Department
和 Employee
对象旁边,维护一个 Employee
到 Department
的映射,并使用此映射查找反向查找。当然这有一些开销,但最大的担忧是事务性(更新可能会更改索引,然后在更新 Department
之前失败)和一致性(如果客户端在您更新后尝试读取数据会发生什么Department
但在您更新索引之前?)
- 双重链接。要求
Department
和 Employee
类 都相互引用。这很棘手,因为它是在繁琐地构建引用,并且具有相同的事务性和一致性问题。也使得引用变得非常困难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,其中包含对 Department
和 Employee
的引用,并为 Employee
提供该引用。或者在 Employee
.
的方法中初始化 Department
我知道这个问题听起来很奇怪,但举个例子可以阐明我的想法。
假设我有 2 个 类 Employee
和 Department
。 Department
有 Arraylist
名员工。这样我就可以访问特定部门的员工。
如果我还需要从 Employee
对象访问员工部门,我该怎么办?我认为将部门也添加到员工对象是一种不好的做法吗?
这是navigability的问题,也是数据库设计中的一个大问题。有几种方法可以实现这一点:
- 蛮力。如果您有
Employee
,请扫描Department
以查找它属于哪个(如果有的话)。显然这是非常低效的,并且假设您有一个包含所有可用Department
的列表。 - 索引。在
Department
和Employee
对象旁边,维护一个Employee
到Department
的映射,并使用此映射查找反向查找。当然这有一些开销,但最大的担忧是事务性(更新可能会更改索引,然后在更新Department
之前失败)和一致性(如果客户端在您更新后尝试读取数据会发生什么Department
但在您更新索引之前?) - 双重链接。要求
Department
和Employee
类 都相互引用。这很棘手,因为它是在繁琐地构建引用,并且具有相同的事务性和一致性问题。也使得引用变得非常困难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,其中包含对 Department
和 Employee
的引用,并为 Employee
提供该引用。或者在 Employee
.
Department