2

さまざまな装飾(または印刷)オプションを持つことができる製品を備えたシステムがあるとします。

ほとんどの製品には同様の範囲の印刷オプション名がありますが、単一の製品に固有の製品もあります。

たとえば、3つの異なる装飾オプションを持つことができるキャップを持つことができます:

  1. ブランドなし
  2. ワンカラープリント
  3. 刺繍

私の目標は、管理者ユーザーが作成する装飾オプション名を最小限に抑えて、常に同じになるようにすることです。IE「1カラープリント」と呼ばれる装飾オプションと「1カラープリント」と呼ばれる別の装飾オプションは必要ありません。

したがって、私の計画はUIにあり、既存の装飾オプション名をドロップダウンするだけでなく、新しい装飾オプション名を追加するオプションも提供します(エッジケースの場合)。

ただし、各装飾オプションには、セットアップコスト、製造時間など、製品によって異なるさまざまなデータが含まれています。

たとえば、Hat1とHat2の両方に刺繡装飾オプションを設定できますが、Hat1のセットアップコストは49ドルで、Hat2のセットアップコストはわずか35ドルです。

だから私の質問は、私のエンティティを構造化するための最良の方法は何ですか?Product、DecorationOption、DecorationOptionNameの3つのエンティティが必要ですか?または、ProductとDecorationOptionの2つのエンティティだけですか?

さらに理解するには、私のコード例を参照してください。

  1. 3つのエンティティオプション
  2. 2つのエンティティオプション
4

1 に答える 1

1

私は3つのエンティティのアプローチを使用しますが、セマンティクスにいくつかの小さな違いがあります:Product、Decoration、およびProductDecoration。これは基本的に多対多の結合テーブルの背後にある考え方ですが、結合を独自のオブジェクトとして扱い、追加情報を格納できます。

製品と装飾は独自の別個のエンティティであり、特定の製品と特定の装飾オプションとの関係に関する情報は、ProductDecorationで管理されます。これは、2つの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
}

2つのエンティティのアプローチを使用することをお勧めする唯一の方法は、Decorationエンティティに「name」列以上が必要になることはないと予想でき、データベースの正規化の潜在的な問題に悩まされていない場合です。

于 2010-11-02T16:14:52.637 に答える