参考"父母"宾语

时间:2017-06-20 23:19:35

标签: java

假设我有两个看起来像这样的类:

public class Human {
     private String name;
     private String id;
     private List<Bike> bikes;
}

public class Bike {
    private String model;
    private String id;
    private String type;
}

现在,把String humanID放到自行车课上是个好主意吗?我可以用当前的结构做很好的每一个操作,但是如果我得到自行车对象并且想要了解他的主人,我需要迭代人类收集。另一方面,如果我把humanID放在自行车里面,我觉得这将是一种多余的信息,因为关系(agregation)本身告诉谁是所有者。那么有人可以解释哪一个是正确的方法以及为什么?

3 个答案:

答案 0 :(得分:4)

完全取决于你的用例。

  1. 基本假设:
    例如,如果您正在为保险公司编写代码,那么每辆自行车都有一个注册所有者是有道理的。存储每辆车的车主是有意义的。而在其他情况下,您可能不想存储所有者。或者甚至可能存在没有所有者的自行车。或多个所有者。
  2. 速度: 正如您所指出的,查找时间可能会有所不同,具体取决于您对数据建模的方式。想想你的计划会是什么样的,以及会发生什么样的操作。如果您要花很多时间查找某辆自行车的车主,那么确保这项操作很快就有意义。
  3. 能见度: 如果所有查找都与&#34;谁拥有这个特定的自行车有关&#34;发生在同一个类中,使用简单的Map可能会更好。这允许你放弃将一个类绑定到另一个类。

答案 1 :(得分:1)

首先,让我们思考它在现实生活中的运作方式(对大多数情况而言):

  • 人类可以拥有他想要的许多自行车
  • 一辆自行车只有一名车主

如何在数据库中映射?

在数据库场景中,我们将有三个表:Human,Bike和HumanBike,这最后一个表,仅用于映射自行车的所有者。

例如:

enter image description here

如何在Java中映射?

Human类,将有一个类型为Bike的Set,映射Human实例拥有的所有自行车:

public class Human {
     private String name;
     private String id;
     private Set<Bike> bikes;
}

另一方面,Bike类可以拥有一个Human字段,映射其所有者:

public class Bike {
    private String model;
    private String id;
    private String type;
    private Human owner;
}

这样,我们实现了双向关联,可以轻松访问关系的两端。

但是,对我的计划最好的是什么?

我们不知道!

这只是一个建议,你的软件可能会有一个完全不同的问题和商务旅馆,所以,我建议你阅读oris Schellekens在这里回答,看看哪种最适合你。

答案 2 :(得分:0)

你可以在自行车内添加一个字段,owner,指向其中一个人。但你也可以有第三堂课:class HumanHasBike{ Human human; List<Bike> bikes;}