以下是我的课程:
class PriceScale
-int ID
-float bookingFees
-Product product
-List<PricePeriod> periods
Class Product
-int ID
-string name
-List<PriceScale> priceScales
class PricePeriod
-DateTime begin
-DateTime end
-float price
-PriceScale scale
正如您所看到的,我严格应用业务规则“产品价格多,价格规模有很多时期”。
我的问题:例如,当我处理Product类时,我不想问自己“是否加载了priceScales?” (因为我每次需要产品时都不会加载它)
解决方案:
1 /延迟加载:我不喜欢它,因为你甚至不知道它就运行sql查询,你最终会遇到1 + n查询问题(我正在研究价格计算系统,所以我真的需要确定执行了哪个sql查询)
2 /总是加载它:我不喜欢它,因为如果我将这个逻辑应用于我将最终加载整个数据库的所有内容。
3 /删除组合(即会员价格标准),在这种情况下,处理价格规模的最佳方式是什么:
获取Dictionnary&lt; int,List&lt; PriceScales&gt;&gt;密钥是产品ID?
别的什么?
4 /在我的方法开头添加我需要priceScales
checkPriceScalesAreLoaded(productList);
它看起来像延迟加载,但它更明确。
5 /我甚至没有想到的其他事情:)由于
答案 0 :(得分:0)
对我而言,这听起来像是一个持久性问题,与OOP或组合并不完全相关。
您是否从数据库加载对象?如果是这样,您使用的语言和持久性机制是什么?这很大程度上影响了可能的解决方案。
例如,对于Java和Hibernate,推荐的方法是使用默认的延迟提取策略,然后根据需要测量性能和微调(在本地选择性地切换提取策略)。您可以切换到单个映射/属性/查询的急切提取或批处理/连接查询,同时保持其余的延迟提取策略。
答案 1 :(得分:0)