我应该为每种数据库查询使用新的实体吗?

时间:2018-10-20 08:52:06

标签: java database architecture entity

是否有最佳实践来避免大量的DTO和实体?

现在,我的应用程序为每个数据库表都有一些实体和DTO。但是,因为来自用户界面的查询 千差万别,我为每个查询创建了新的实体和DTO,这导致DTO-Entity陷入困境。

举这个例子:

尽管我们的应用程序非常简单,并且只有两个数据库表:

  • 具有id,名称,年龄,vehicle_id的人员表;
  • 具有ID,品牌名称,速度,价格的车辆表;

起点是我们只有以下课程:

  • PersonEntity,PersonDto,VehicleEntity,VehicleDto

用户可以通过ID和名称获取“人员,车辆”。 到目前为止很简单。

但是我们有一个新要求:

用户想通过人名查询平均车辆价格。 (即,所有法兰克人拥有的车辆的平均零售价为25.213 $) 因此,在ui方面,我们需要一个对象: PersonGrouppedAvgPrice,其中包含personName和averagePrice字段

我找到了以下解决方案:

  1. 所以我们要么从数据库中获取所有具有给定名称的Person和相应的汽车 并将其返回给用户界面(计算将在用户界面侧进行), 这会导致不必要的网络流量和内存消耗,但至少我们没有被迫创建新实体。

  2. 我们仍然从db获取上述所有内容,并在DTO级别的服务器端进行计算。在这种情况下 我们仍然没有被迫创建新的实体,但是我们必须创建新的DTO。网络流量降低,但内存仍然 高。

  3. 我们使用以下查询在DAO级别上做出相应的逻辑:
    从person_table中选择p.name,avg(v.price)作为p内部连接... etc 在这种情况下,我们只获取最有效的必要信息,但在这种情况下,我们需要新的DTO和实体。

我用了第三个。 但是由于各种UI查询,新类的数量升级到了将来无法维护的水平。 对于20个数据库表,我不得不创建〜4-4 Entity和DTO,这是〜160个类。

还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

第3点是RDMBS的正确方法。您应该使用查询在数据库中执行此工作,因为将所有表数据从数据库服务器传输到应用程序服务器效率很低。

对于每个需要特殊投影的自定义查询,您可能最终会得到其他DTO类。这不一定是错误的,它将有助于编写单元测试。减少DTO类数量的方法很少,例如通过使用元组as described in this article