2010-11-01 97 views
2

假設我有一個可以有多種裝飾(或打印)選項的產品系統。Doctrine 2中的'name'屬性

大多數產品將具有類似的打印選項名稱範圍,但某些產品可能有一些是唯一的。

例如,我可以有一個上限,可能有三種不同的裝修方案:

  1. 沒有品牌的
  2. 單色打印
  3. 刺繡

我的目標是試圖儘量減少裝修選項名稱由管理員用戶創建,因此它們始終相同。 I.E.我不希望一些裝飾選項被稱爲「1彩色打印」,然後另一個稱爲「單色打印」。

所以我的計劃是在UI中有一個現有的裝飾選項名稱下拉,但也給他們添加一個新的(邊緣情況下)的選項。

但是,每個裝飾選項都有其他各種數據,如設置成本,生產時間等,這些數據因產品而異。

例如,Hat1和Hat2都可以有刺繡裝飾選項,但是Hat1的設置成本是49美元,Hat2的設置成本只有35美元。

所以我的問題是,什麼是最好的方式來構建我的實體?我應該有三個實體:Product,DecorationOption和DecorationOptionName?或者只有兩個實體:Product和DecorationOption?

請參閱我的代碼示例,進一步瞭解:

  1. Three entities option
  2. Two entities option

回答

1

我會用這三個實體的方法,在語義一些細微差別:產品,擺件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 
} 

我建議使用兩個實體的方法,唯一的方法是,如果你可以預見永遠需要比對裝飾實體「名稱」欄中多了,你不被潛在的數據庫標準化問題困擾。

+0

完美!如果沒有關於連接表的額外信息,你認爲這是必要的嗎?例如,一個產品有多個圖像,所有這些圖像都將被標記(正面,背面,頂部等),但有些產品會有邊緣案例標籤,但我想盡可能保持一致。看看這裏:http://pastie.org/1268445 – Cobby 2010-11-03 02:25:34

+0

嗯,我猜ImagePosition不是加入表...但你得到了我希望的想法/問題。 – Cobby 2010-11-03 02:26:16

+1

每個例子都很難說。基本上,如果你需要一個對象來執行業務邏輯,你應該有一個實體。如果您有一套支持該標籤系統的複雜邏輯,請創建一個實體。如果不是的話,你可能會用這兩張桌子。另外,Doctrine確實有一個@ManyToMany關聯,它使用一個連接表而不需要創建第三個實體。 – 2010-11-03 19:35:51