从数据层填充域模型,还是直接查询数据库?

时间:2016-05-09 07:38:58

标签: database hibernate orm architecture domain-driven-design

假设我有一个域模型,其中3个对象互动,预订车辆 Fleet 。舰队有很多车辆,每辆车可以有很多预订。例如

Fleet -1--*- Vehicle -1--*- Reservation

如果我希望 Fleet 拥有方法 getMostPopularVehicle(),我可以让它迭代每辆车并计算预订数量。

如果我想为持久性引入ORM,我应该(1)让getMostPopularVehicle()调用数据层方法来填充Fleet,Vehicles和Reservations,然后再像之前一样进行迭代吗?或者我(2)现在只是直接查询数据库以获得数据层方法中最受欢迎的车辆?

我的想法是(1)是正确的,但数据库查询可以非常有效。也许我接近这一切都错了?

2 个答案:

答案 0 :(得分:1)

两种方法都有效。这取决于你想要达到的目标;如果您可以通过发布(HQL或JPQL或任何您支持的ORM)查询(也使用您的域模型)来获得性能,那么执行此操作是非常合法的。

答案 1 :(得分:1)

如果预计这些统计数据随时可用,我可能会选择另外两种方案中的一种,以避免经常执行潜在的重载查询(如果有的话):

  1. 使用CQRS通过直接查询数据库(避开域模型)来检索数据。可以缓存返回的视图模型,以避免后续用户导致查询再次执行。
  2. 创建单独的报告数据库。键入车队ID和车辆ID的值,并且可以为每个预订将值增加5,然后每周将每个值减1,永远不会低于0.这样,您可以保持相当具有代表性的滚动统计数据,同时能够快速查询表并找到给定车队的最高值行。