2

假设我有一个产品系统,可以有各种装饰(或印刷)选项。

大多数产品将具有类似的打印选项名称范围,但某些产品可能是单一产品独有的。

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

  1. 无品牌
  2. 一种颜色打印
  3. 刺绣

我的目标是尽量减少管理员用户创建的装饰选项名称,以便它们始终相同。IE 我不希望一些装饰选项被称为“1 色打印”,然后另一个被称为“单色打印”。

所以我的计划是在 UI 中下拉现有的装饰选项名称,但也让他们可以选择添加一个新的选项(对于边缘情况)。

但是,每个装饰选项都有各种其他数据,例如设置成本、生产时间等,这些数据因产品而异。

例如,Hat1 和 Hat2 都可以有刺绣装饰选项,但 Hat1 的设置成本为 49 美元,Hat2 的设置成本仅为 35 美元。

所以我的问题是,构建我的实体的最佳方式是什么?我应该拥有三个实体:Product、DecorationOption 和 DecorationOptionName?还是只有两个实体:Product 和 DecorationOption?

请查看我的代码示例以进一步了解:

  1. 三实体选项
  2. 两个实体选项
4

1 回答 1

1

我将使用三实体方法,在语义上有一些细微差别:Product、Decoration 和 ProductDecoration。它本质上是多对多连接表背后的想法,但您将连接视为它自己的对象,您可以在其中存储额外信息。

Products 和Decoration 是它们自己独立的实体,任何给定Product 和任何给定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
}

我建议使用两个实体方法的唯一方法是,如果您可以预期装饰实体永远不需要超过“名称”列,并且您不会被潜在的数据库规范化问题所困扰。

于 2010-11-02T16:14:52.637 回答