对于在.NET应用程序的域/数据库中为以下场景建模的好方法,任何人都有任何想法吗?假设我有一些可以应用于销售交易的折扣,但折扣应仅适用于特定时间的某一天的特定日期。因此,例如,如果在周一上午9点到中午之间发生销售,则应该应用折扣,但如果在这些时间之间的周二发生销售,则不应用折扣。我希望能够在同一天内处理多个时间段(即 - 周三上午9点 - 中午和下午6点 - 午夜。
答案 0 :(得分:1)
我只想写一个“GetDiscount”方法来实现你所描述的逻辑。您可以使用DateTime对象来确定当前日期和时间。
从您的描述中不清楚为什么这样简单的解决方案对您不起作用。你到底想要什么?
答案 1 :(得分:0)
我做过类似的事情。
您的SalePrice表看起来像(该死的降价表):
SalePriceId Guid,PK
ItemId Guid,FK
StartTime Timespan
结束时间 Timespan
DaysOfWeek DaysOfWeek(flag enum)
折扣加倍
(这是来自代码视图; Timespan是一个在Sql 2008中映射的.NET类)
DaysOfWeek是一个包含Sun-Sat的标志枚举。
因此,要查找星期二生效的项目的任何销售,您可以执行类似
的操作select *
from SalePrice
where ItemId = @itemGuid
and StartTime <= @time
and EndTime >= @time
and DaysOfWeek & @DOW = @DOW
这是基本模式。不要指望这是复制粘贴工作(我不确定我的按位查询的东西),但我成功地使用这种模式来跟踪当前的价格。
答案 2 :(得分:0)
我假设你将折扣应用于一个comlete订单而不是单个商品,我会创建以下两个类。
class Order
{
Guid Id;
DateTime TimeStamp;
Discount Discount;
}
class Discount
{
Guid Id;
DayOfWeek Day;
TimeSpan StartTime;
TimeSpan EndTime;
Decimal Amount;
}
然后,您可以使用Order.TimeStamp.DayOfWeek
和Order.TimeStamp.TimeOfDay
并搜索折扣列表,直到找到对已处理订单有效的Discount
并在Order
上存储参考宾语。将此映射到数据库应该非常简单 - DayofWeek
可以存储为整数,DateTime
和TimeSpan
也可以使用。
棘手的部分是约束Order
和Discount
之间的一对多关系。可以尝试使用触发器或检查约束,但我建议仅在应用程序中强制执行此逻辑,因为通过在数据库级别强制执行它不会获得那么多。