Database design 条令映射DDD:一个实体管理器上两个或多个实体到一个表的映射

Database design 条令映射DDD:一个实体管理器上两个或多个实体到一个表的映射,database-design,orm,doctrine-orm,domain-driven-design,Database Design,Orm,Doctrine Orm,Domain Driven Design,我遵循DDD,我有一个查询上下文,其中包含营销人员和编码器实体。基本上,这两者具有相同的数据(它们是系统的用户),但逻辑不同(基于域)。我不想应用单表继承(它将添加一个discrimiator列),因为该表将在另一个上下文中使用 在我的代码中,营销人员有PersonName值对象和一个FOSUserBundle用户 /** * Class Marketer * @package Elite\Model\Inquiry */ class Marketer { private $us

我遵循DDD,我有一个查询上下文,其中包含营销人员和编码器实体。基本上,这两者具有相同的数据(它们是系统的用户),但逻辑不同(基于域)。我不想应用单表继承(它将添加一个discrimiator列),因为该表将在另一个上下文中使用

在我的代码中,营销人员有PersonName值对象和一个FOSUserBundle用户

/**
 * Class Marketer
 * @package Elite\Model\Inquiry
 */
class Marketer
{

    private $userAccount;
    private $name;

    public function __construct(IdentityUser $userAccount, PersonName $name)
    {
        $this->userAccount = $userAccount;
        $this->name = $name;
    }
}

/**
 * The receiver of the inquiry
 * @package Elite\Model\Inquiry
 */
class Encoder
{
    public function __construct(IdentityUser $userAccount, PersonName $name)
    {
        parent::__construct($userAccount, $name);
    }

    /**
     * Make an inquiry for the inquirer
     *
     * @param Inquirer $inquirer The inquirer
     *
     * @param Marketer $marketer The marketer to be assigned to follow up
     * @param \DateTime $date The date of inquiry
     * @return Inquiry The inquiry
     */
    public function makeInquiry(Inquirer $inquirer, Marketer $marketer, \DateTime $date)
    {
        return new Inquiry($inquirer, $this->userAccount, $marketer, $date);
    }
}
如何将两个实体映射到一个表上

有没有比我现在拥有的更好的设计

查询是否需要在其构造函数上使用编码器


我应该在编码器之外实例化查询吗?只需将FOSUSer的实例传递给INquiry?

我建议您阅读Eric Evans的《域驱动设计》和Vaughn Vernon的《实现域驱动设计》两本书。DDD与数据无关。因此,您是否确定Marketer和Encoder确实属于同一个有界上下文,甚至是聚合的,特别是如果他们是系统的用户,那么用户和授权通常是一个单独的有界上下文?否则,使用值对象来表示营销者和编码者。仅在真正需要时使用实体(在值更改时保持标识)。并将它们与书中的一个标准方法耦合到用户上下文中的用户

回答关于一个表的问题:在DDD中与“共享表”最匹配的是“共享内核”。但是,在更复杂的场景中,它被认为是一个错误的选择,应该谨慎使用。如果用户、营销人员和编码器最终处于不同的有界上下文中,那么它们应该存储在不同的表中,因为每个有界上下文都有自己的数据存储(至少在我对DDD的理解中是这样)