我应该总是从数据库中检索完整对象吗?

时间:2012-06-04 09:21:24

标签: java oop database-design architecture orm

这是一个非常简单的问题,适用于使用java编程Web界面。说,我没有使用ORM(即使我使用的是ORM),让我说我的应用程序中有这个Car(id,name,color,type,blah,blah)实体,我有一个CAR表到在数据库中表示此实体。所以,我说我需要只更新一堆汽车的一部分字段,我知道典型的流程是:

  1. DAO类(CarDAO) - getCarsForUpdate()
  2. 迭代所有Car对象,只更新颜色以说绿色或其他。
  3. 另一个DAO致电updateCars(汽车)。
  4. 现在,对于简单的选择和更新查询来说,这不是一个小小的打击吗?在上面的第一步中,我将从数据库中检索整个对象数据:“选择id,name,color,type,blah,blah .. where ..from CAR ”而不是“< strong>选择id,来自CAR的颜色...... “。那么为什么我在发布DAO调用时应该检索那些额外的字段我永远不会使用除“颜色”之外的任何东西?这同样适用于最后一步3.或者,我只是查询id和颜色(选择id,颜色)并创建一个只有id和颜色填充的汽车对象 - 这是完全可以的,不是吗?无论如何,Car对象都是贫血的?

    难道所有这些(面向对象的)都不是假的吗?

3 个答案:

答案 0 :(得分:4)

首先,我希望如果RDBMS可以处理您的查询,那就让它。原因是您不希望JVM完成所有工作,尤其是在运行企业应用程序时(并且您有许多并发连接需要相同的资源)。

如果你特别想在数据库中更新一个对象(例如将汽车颜色设置为绿色),我会建议像

这样的SQL
UPDATE CAR SET COLOR = 'GREEN';

(注意我没有使用 WHERE 子句)。这会更新所有 CAR表,我无需提取所有Car个对象,请致电setColor("Green")并进行更新。

事后来说,我想说的是应用工程知识。您的DAO应该只是快速选择,更新等,并让所有SQL“工作”由RDBMS处理。

答案 1 :(得分:2)

根据我的经验,我可以说: 只要您没有进行连接操作,即只查询同一个表中的列,您获取的列数几乎不会改变性能。真正影响性能的是你获得了多少行,以及where子句。获取2或20列的变化很少,您将看不到任何差异。 更新同样的事情

答案 2 :(得分:1)

我认为在某些情况下, 对于请求对象的字段子集非常有用。如果您有大量列,或者如果有一些大的BLOB列会影响性能(如果它们是水合的),那么这可能会获得性能提升。虽然数据库通常在匹配时读入整行信息,但通常会将BLOB和其他大字段存储在不同位置并且具有非平凡的IO要求。

如果您在大型表中进行迭代并进行某种处理,这也可能有意义。虽然单行上的节省量可能微不足道,但在大型表格中可能是可以衡量的。

此外,如果您只使用索引中的字段,我相信该行本身永远不会被读取,它将使用索引本身的字段。在您的示例中不确定是否会为color编制索引。

所有这些说,如果你只是持久化没有BLOB或其他大型数据库字段的相对简单的对象,那么这可能会变成过早优化,因为查询处理,行IO,JDBC开销和对象创建是与保湿行中的一部分字段相比,最有可能花费更多的时间。将数据库对象转换为最终的Java类通常只是每个查询负载的一小部分。