对象组合——成分应该知道组合对象吗?

Object Composition - Should a Constituent Know the Composing Object?

我正在构建一个包含报告的应用程序,每个报告都包含多个结果。这绝对是报告和结果之间的HAS-A组合类型关系。

我的问题是:结果应该知道它属于哪个报告吗?

方法 A(结果不知道它属于哪个报告):

Report:
    name
    id
    results[]


Result:
    value
    type
    id

方法B(结果知道它属于哪个报告,但报告不包含结果):

Report:
    name
    id

Result:
    value
    type
    id
    report_id

我认为用给定的信息不可能回答这个问题,所以与其直接回答,不如看看可能影响决策的因素:

你需要反向引用吗?显然,如果你不需要它,就不要创建它。如果你确实需要它,尽管你仍然可以用某种存储库查找来替换它,比如:ReportRepository.findReport(Result)

反向引用的成本与没有反向引用的成本是多少?如果您包含反向引用,如果所有权发生变化(在您的情况下可能不会发生) 两个引用需要保持同步。如果您没有反向引用但需要朝这个方向导航,则您必须跳过额外的环节。当持久化双向关系时,诸如 JPA 映射之类的事情变得更加复杂。当您需要以某种方式序列化结果时,同样的事情可能适用。

虽然它似乎不适用于您的情况,但也可能值得查看 Aggregate pattern from DDD