Symfony形成大数据集

问题描述

对于Symfony 4项目,我们需要制作一个inpection的大型surfaces表格,其中包含许多字段。我们正在寻找一种方法来组织结构和关系并牢记加载速度。

我创建了下面的基本实体示例,该示例仍然很容易存储在一个数据库表中。下面的字段是简单的关系或字符串字段,因此inspectionType很容易。

class inspection
{
    /** @var string */
    protected $projectName;

    /** @var string */
    protected $projectPlace;

    /** @var User */
    protected $inpector;

    /** @var Customer */
    protected $customer;

    /** @var string */
    protected $conclusion;

    /** @var string */
    protected $advice;

    // Complex part
    
    /** @var Collection */
    protected $surfaces;
}

现在是复杂的部分。 每个检查可以包含一个或多个表面(ArrayCollection)。 每个表面都包含不同的字段,请参见下文:

  • 屋顶表面(4个字段);
  1. 文本类型
  2. 选择类型(单个)
  3. 选择类型(多个)
  4. 日期类型
  • 泄漏(3个字段);
  1. 文本类型
  2. 图像(关系,一对多)
  3. 选择类型(单个)
  • 张力(3个字段);
  • 坡度(3个字段);
  • 屋顶污染(3个字段);
  • 损坏(5个字段);
  • 镇流器(3个字段);
  • (3个字段);
  • UprightWork (4个字段);
  • 扩张叛乱(5个字段);
  • 烟囱(3个字段);
  • 分流箱(3个字段);
  • ... 9个以上+;

我的问题是如何设置surfaces数据库结构,表面上的每个零件都应像下面这样在其表上具有与检查的关系(这会创建很多表,这不好吗?):>

  • 表感染
  • 表inpection_leakage
  • 表inpection_tension
  • ...

我当时正在考虑创建一个如下所示的嵌入收藏表格

class inspectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        // ...

        $builder->add('surfaces',CollectionType::class,[
            'entry_type' => SurfaceType::class,'entry_options' => ['label' => false],]);
    }
}

class SurfaceType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $builder->add('leakage',LeakageTyoe::class);
        $builder->add('tension',Tension::class);
        $builder->add('slope',Slope::class);
        ...
    }
}

是这种方式:)走

解决方法

我建议您为表面实体使用discriminator/inheritance map,并采用single_table策略。这样可以为您提供所需的速度和灵活性。