まず、ここで説明したのは動作であり、データ ストレージではありません。したがって、これをデータベースにどのように保存するかは重要ですが、主な関心事は、これのコードをどのように記述するかです。
C#の例として
public class Product {
public string Name { get; set; }
public decimal UnitCost { get; set; }
public List<IPromotion> { get; set; }
}
public interface IPromotion {
decimal CalculateTotalDiscount(Product p, int quantity);
}
public class BuyAndGetFreePromotion : IPromotion {
public int QuantityRequiredToGetPromotion { get; set; }
public int NumberOfUnitsFree { get; set; }
public decimal CalculateTotalDiscount(Product p, int quantity) {
if (QuantityRequiredToGetPromotion == quantity) {
return (p.UnitCost * quantity) - (p.UnitCost * NumberOfUnitsFree );
}
return 0;
}
これで、テーブル クラス階層またはクラスごとのテーブルのいずれかを実行できます。これは、使用している ORM に大きく依存します。
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/inheritance.html
http://my.safaribooksonline.com/book/web-development/ruby/9780132480345/advanced-active-record /ch09lev1sec5#title-ID0EBYHK
質問は。2% の割引がプロモーションとして保存されるとは思いませんが、請求書/請求書の責任となります。したがって、複数のテーブルを用意するかどうかの決定は、代わりに、利用可能なさまざまなタイプのプロモーションと、モデル化して単一のテーブルに一貫して格納できるかどうかに基づいて行う必要があります。プロモーションの例は他にもありますか?現在のところ、1 つのテーブルで十分です。