说我有一个系统的产品,可以有各种装饰的(或打印)的选择。

大多数产品将具有类似范围内的印刷方案的名称,但有些也许唯一的一个单一的产品。

例如,我可以有一个帽子可能有三种不同的装饰的选择:

  1. 牌子
  2. 一种颜色印
  3. 刺绣

我的目标是试图尽量减小装饰的选择名创建的通过管理员用户,所以他们总是相同的。E.I.我不想要一些装饰选项被称为"1彩色打印",然后另外一个称为"一个彩色打印"。

所以我的计划是在UI是有一滴下的现有装修方案的名称,但也给他们的选项添加一个新的(为边缘情况下)。

然而,每一个装饰的选择具有各种其他数据,如设置成本、生产时间,等等,这取决于产品。

例如,Hat1和Hat2可能两者都有一个绣花装饰的选择,但Hat1的安装费用为49和Hat2的安装成本仅为35美元。

所以我的问题是,什么是最好的方式结构,我实体?我应该有三个实体:产品,DecorationOption和DecorationOptionName?或者只是两个实体:产品和DecorationOption?

请参阅我的代码的例子进一步了解:

  1. 三个实体的选择
  2. 两个实体的选择
有帮助吗?

解决方案

我会用这三个实体的做法,与一些细微的差别在语义:产品、装修和ProductDecoration.它是本质上的理念的背后有许多对多加入表中,但是将加入作为它自己的目的,在哪里你可以存储额外信息。

产品和装饰自己的独立的实体,以及信息之间关系的任何特定产品和任何给定的DecorationOption管理ProductDecoration.你可以实现这种使用两个OneToMany关系。

<?php

class Product 
{   
    /** @OneToMany(targetEntity="ProductDecoration", mappedBy="product") */
    private $productDecorations;

}


class Decoration
{   
   /** @Column(type="string") */
   private $name;   

   /** @OneToMany(targetEntity="ProductDecoration", mappedBy="decoration") */
   private $productDecorations;
}

class ProductDecorations
{   

   /** @ManyToOne(targetEntity="Product", inversedBy="productDecorations") */
   private $product;

   /** @ManyToOne(targetEntity="Decoration", inversedBy="productDecorations") */
   private $decoration;

   /** @Column(type="integer") */
   private $setupCost;

   /** @Column(type="integer") */
   private $productionTime
}

只有这样我推荐使用的两个实体做法是如果你可以预计不需要更多的名字列于装修的实体,你是不是困扰的潜在数据库标准化问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top