Во-первых, вы описали здесь поведение, а не хранение данных. Итак, пока, как вы храните это в базе данных, важно, чтобы ваша главная проблема заключалась в том, как вы пишете код для этого.
так как, например, в 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% -ная скидка будет храниться в качестве Акции, но скорее будет за счет счета/счета. Поэтому решение о том, следует ли иметь несколько таблиц, должно быть основано на разных типах доступных рекламных акций и может ли они быть смоделированы и сохранены последовательно в одной таблице. У вас есть больше примеров рекламных акций, так как в настоящее время я бы сказал, что одна таблица вполне приемлема.
Использовать модель ценообразования Silverston в книге ресурсов ресурсов модели Vol 1. –