Inheritance 条令继承映射设计模式与性能

Inheritance 条令继承映射设计模式与性能,inheritance,design-patterns,doctrine-orm,mapping,Inheritance,Design Patterns,Doctrine Orm,Mapping,在我的项目中,我想使用继承映射,但我不知道如何正确使用它,以及它对性能和设计模式是否有意义 例如,我有三个实体 事件,事件Facebook,事件Google 我想使用事件作为MappedSuperclass,然后 Facebook和谷歌事件的实体作为一个孩子 这些实体将包含特定字段 我应该使用什么: 使用@InheritanceType(“单表”)为什么 使用@InheritanceType(“JOINED”)为什么 不要只使用空字段来使用继承映射,为什么 根据您的描述: 我想使用事件作为Ma

在我的项目中,我想使用继承映射,但我不知道如何正确使用它,以及它对性能和设计模式是否有意义

例如,我有三个实体

事件,事件Facebook,事件Google

我想使用事件作为MappedSuperclass,然后

Facebook和谷歌事件的实体作为一个孩子

这些实体将包含特定字段

我应该使用什么:

  • 使用@InheritanceType(“单表”)为什么
  • 使用@InheritanceType(“JOINED”)为什么
  • 不要只使用空字段来使用继承映射,为什么
根据您的描述:

  • 我想使用事件作为MappedSuperclass,然后
  • Facebook和谷歌事件的实体作为一个孩子
  • 这些实体将包含特定字段。(特别是这个)
  • 单表继承不适用 当子项具有相同属性时,将使用此继承。以以下结构为例:

    Image abstract class
     - name
     - size
     - extension
     + abstract manipulate();
    
    Png类扩展图像

    function manipulate(){
       echo "I am a PNG image";
    }
    
    function manipulate(){
       echo "I am a GIFT image";
    }
    
    礼品类拓展形象

    function manipulate(){
       echo "I am a PNG image";
    }
    
    function manipulate(){
       echo "I am a GIFT image";
    }
    
    所有类共享相同的属性,然后您可以将其所有数据存储在一个表中。只需要将一列标记为类型标识符,例如扩展列

    @DiscriminatorColumn(name="extension", type="string")
    @DiscriminatorMap({".png" = "PngClass", ".gift" = "GiftCLass"})
    
    id_image | name | size | extension
    1           a      10       .png    
    2           c      8        .gift  
    
    类表继承(这是正确的) 原因很简单,每个类都有自己的属性。所以,父表应该保留与每个子表相关的公共数据

    图像表

    id |  name | size | extension
    1      a      10       .png
    2      b      8        .gift
    
    现在,例如,您希望跟踪礼物移动的持续时间。对于png图像,您要设置最大大小限制。每个属性对于每个类都是唯一的,并且在语义上可以应用于另一个类:礼物不能调整大小,png也不能移动

    Png表格

    id | limit
    1  |  10x
    
    礼品台

    id | movement
    2  |  5s
    
    id列用于联接父子数据

    考虑
    • 使用自己的数据管理专用对象非常简单
    • 要加载实体,请使用join语句进行查询。对于大型数据库,这可能会影响加载数据的时间和更多资源
    • 在这种情况下,如果多对一或一对一关联的目标实体是图像(CTI),则应尽可能简单地保持该实体(避免其他关联),因为条令无法为图像类创建代理

      • 谢谢您的回答

        经过反思,我的EventFacebook和EventGoogle没有太多不同的属性

        我已经测试过了

        Use @InheritanceType("JOINED") 
        
        但这使我的模型变得复杂,向我的模型添加了一个连接,设计模式的好处实际上是有限的

        因此,我选择把一些领域空为未来的表现

        当你看到像FOSUserBundle这样著名的包时,我们可以看到空字段

        这样做并不使我感到震惊


        我希望它能帮助那些想这样做的人。

        更新你的问题,并显示Facebook和Google活动的不同属性。不同属性的数量将决定您在单个表与联接表之间的选择。如果存在大量差异,请使用joined。如果它们几乎相同,请使用single。这里有一点是错误的。如果使用单表继承,则条令足以区分两个类。公共字段应位于映射的超类中,特定字段应位于特定子类中。您将看到,当条令创建模式时,它会将子类中的特定字段标记为可空。这意味着您可以在一个表中保存具有相同映射超类但不同字段的两个实体。实际上,应该选择可维护性。如果子类有太多的字段,使用多表,如果没有,可以使用单表是的,足够聪明。甚至可以使用同一个表映射多个类。然而,在实践中使用这种方法是不合逻辑的,应该避免使用您解释单表继承的方式,
        当子项具有相同属性时使用这种继承
        从教义的映射继承角度来看是不正确的。从设计的角度来看,你可能是对的。OP特别询问了有关条令的问题。如果类具有相同的属性(或者我说字段),则不需要子类。看见此外,性能方面的单表继承非常有效,因为不执行SQL连接。