【发布时间】:2023-03-10 17:08:01
【问题描述】:
到目前为止,我一直在处理的大多数对象看起来都非常类似于它们所基于的数据库表。所以我有一个映射 db.fish 表的 fish 对象和一个映射 db.fish_transfer 表的 fish_transfer 对象等。
现在我正在研究一个类Provenance,它管理不容易映射到单个数据库表的数据。情况如下:
每条鱼都有一个出处,即关于它在进入我们系统之前的位置的信息。有 4 种来源:“未知”、“交付”、“现场培育”、“重复使用”。所有出处都有一个 fish_id 和一个相关的日期,除了“现场繁殖”之外的所有来源都需要立即设置计数。除此之外,它们在与之关联的数据以及在创建/删除或更改时必须执行的操作方面存在很大差异。
我曾想过将出处类型存储在 fish 对象中。因此,在实例化时,fish 将调用 ProvenanceFactory::make($this->fish_id, $this->ptype) 并获得正确子类的出处对象 $prov。那么如果编辑了出处类型会发生什么?
可能性:
- 拨打
$this->prov->delete(),然后拨打$this->prov=ProvenanceFactory::make($this->fish_id, $newtype); $this->prov->setall($data); - 致电
ProvenanceFactory::morph(&$this->prov,$newtype); $this->prov->setall($data); - 致电
$this->prov->morph($newtype); $this->prov->setall($data); - 致电
$this->prov->morph($newtype, $data); - ??
在所有情况下,编辑出处类型都会导致更新或删除特定于 Provenance 子类的各种表中的一组数据库行,然后在各种其他表中创建另一组行。
上述哪种可能性(或其他可能性)是最好的选择?我应该尝试实现什么设计模式(Factory 除外)?
【问题讨论】:
-
将其视为一系列问题可能会有所帮助:1.如何在域模型中表示实体
Provenance,delivered`等? 2.如何在数据库中表示那些实体? 3.如何同步两个表示之间的变化?问题1和2其实是相互独立的,可以分开考虑。
标签: php oop design-patterns