设计实体模型来管理多个双向关系

Posted

技术标签:

【中文标题】设计实体模型来管理多个双向关系【英文标题】:Design entity model to manage multiple bidirectionnal relations 【发布时间】:2013-06-17 02:40:05 【问题描述】:

我正在尝试从我的模型中找到设计实体之间关系的最佳方式。我会尽量解释清楚。

想象以下 Doctrine2 实体:

class ImageHistory

    /**
     * @var Image
     */
    protected $current;

    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    protected $old;


class Dog

    protected $name;

    /**
     * @var ImageHistory
     */
    protected $imageHistory;


class Cat

    protected $name;

    /**
     * @var ImageHistory
     */
    protected $imageHistory;

我想建立两个一对多的双向学说关系,其中CatDog 是关系的拥有方。 CatDog 类都有这个实体配置:

manyToOne:
    imageHistory:
        targetEntity: ImageHistory
        joinColumn:
            name: image_history_id
            referencedColumnName: id

如何表示te关系的另一边?

oneToMany:
    owner:
        targetEntity: <What can I write here?>
        mappedBy: imageHistory

我想象一个解决方案,其中CatDog 继承Animal 实体类,因此我可以将ManyToOne 关系移动到Animal 类并将Animal 作为OneToMany 关系的targetEntity。但是如果我有一个新的SoundHistory 实体并且:CatDog 和新的CarBoat 类必须与它有关系,问题就会再次出现。

A 不能只是将 SoundHistory 添加为与 Animal 类的 oneToMany 关系,因为 CarBoat 不会从它继承。所以我仍然无法在ImageHistory 实体中填充我的OneToMany 关系的targetEntity

在这种情况下设计实体模型的最佳方法是什么?

【问题讨论】:

您能解释一下 SQL 中的关系吗? 使用界面? ***.com/questions/42649553/… 使用一些 AbstractEntity?有点 MotherOfAllObjects/Entities 你可以使用@OneToMany注解。见enter link description here 【参考方案1】:

Many-To-One Relation 是单向的,所以不能代表对方。

另外,如果您真的想将 Dogs 和 Cats 存储在同一个表中,您应该考虑创建一个超级实体。

【讨论】:

其实Many-To-One可以是bidir(见doctrine-project.org/projects/doctrine-orm/en/2.6/reference/…)。【参考方案2】:

最好的方法是使用单独的连接表来表示CatDogImageHistorySoundHistory 之间的关系。为此,您可以使用连接表的一对多单向映射。在这里找到教义文档,感谢 NaeiKinDus:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#one-to-many-unidirectional-with-join-table

重点是 - 图像和声音历史记录是独立存储的,连接表 cat_image_history 存储 Cat 拥有的 ImageHistory。所以 Doctrine 会得到你的猫的id,检查cat_image_history 并通过image_history_id 得到正确的ImageHistory。同样的方式,您可以为狗添加SoundHistory,或者同时为猫和狗添加。

映射可能如下所示:

Cat:
  type: entity
  manyToMany:
    imageHistory:
      targetEntity: ImageHistory
      joinTable:
        name: cat_image_history
        joinColumns:
          cat_id:
            referencedColumnName: id
        inverseJoinColumns:
          image_history_id:
            referencedColumnName: id
            unique: true

【讨论】:

以上是关于设计实体模型来管理多个双向关系的主要内容,如果未能解决你的问题,请参考以下文章

数据库——数据库设计 E-R图向关系模型的转换

数据库的设计

数据库中的实体,实体型,实体集解析

抓取百万知乎用户设计之实体设计

ios核心数据设计问题

数据库设计实现