php - 最佳实践 : how to implement many-to-many relations using Domain Models without framework

标签 php database domain-driven-design

你好 stackoverflow 成员,

我正在使用纯 PHP 来实现域模型。我有两个实体,实体 dog 和实体 human 作为狗的主人。

这是一个多对多的关系。一个 owner 可以拥有不止一只 dogdog 由许多 human 拥有(假设这只狗属于给一个家庭或一对夫妇)。

我有一个doghuman 的数据库表,还有n:n 连接表。我有两个实体,它们是 POPO。我还有两个存储库,一个用于 dog,一个用于 human。这些存储库具有 CRUD 操作,并负责数据库查询。

哪个存储库负责管理 n:n 表?

示例:

实体 dog 有一个包含所有连接的 human 的属性数组,反之亦然。如果我创建一个新的 human,例如:$human = new Human('name'); 并让他拥有一条已经存在的 dog,例如: $human->addDog($dog); 谁负责 n:n 连接? 我可以执行 $dogRepo->Update($human->getDogs()[0]); 来更新数据库中的狗,或者我可以执行 $humanRepo->Insert($human) 。 DogRepo 是否也应该插入新的 human(利用 HumanRepo)? HumanRepo 是否也应该更新 dog(利用 DogRepo)。还是业务逻辑对此负责? (从业务逻辑中分别调用 insertHuman()updateDog())。 在所有这些方法中,我不知道哪个存储库负责 n:n 表?

听起来像是一个常见问题,但我在网上找不到合适的解决方案。

提前致谢!

最佳答案

在 DDD 中,我们根据业务规则设计聚合。每个聚合都保护自己的不变量。我们设计的时候脑子里没有表或者关系表,只有不变量和一致性要求。

话虽如此,您遇到困难是因为您没有确定不变量或根本没有。

养狗的人是否有某种特定的行为方式?如果人类不拥有/确实拥有狗,是否会拒绝某些人类命令?然后添加到 Human 聚合拥有的狗 ID 列表(而不是狗实例!)。

人类拥有的狗与没有主人的狗的行为是否不同?然后向 Dog 聚合所有者 ID 列表。

或者它们之间的这种关系仅显示在用户界面中?然后将其添加为单独的聚合,即 DogOwnershipByAHuman(id, dogId, humanId) 不污染 DogHuman 聚合数据不需要。

关于php - 最佳实践 : how to implement many-to-many relations using Domain Models without framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53408757/

相关文章:

php - 使用浏览器时Redis不工作

mongodb - 从 csv 导入数据时如何更改 mongodb 中自动生成的 _id 字段?

Django 和领域层

sql - 如何简化 where 子句中的嵌套 select?

mysql - 表特定查询与单个通用查询

domain-driven-design - 为什么域服务必须使用域对象作为参数并返回值?

java - 验证不可变值对象的良好做法

php - 从 JSON 数据中删除注释

php - 如何在Windows服务器上使用.htaccess文件

php - Netbeans for PHP 中的 "class outline view"在哪里?