我必须为餐馆连锁店设计一个数据库。
情况如下 - 当他购买物品C时,顾客获得物品A免费或物品B免费(不是两者)。
以下是我的DB中的两个表。 br />
对于上面的示例,我将在HappyHour_Menu_Trans中插入项目C的条目,该条目将生成新的HappyHourMenuTransId。
使用此HappyHourMenuTransId,我将在HappyHour_Menu_Subsequent表中插入两个条目。
现在可选部分呢?
我可以考虑添加一个“条件”列,其中我将为两个条目设置值“OR”。这个OR会告诉我,我只能选择一个选项。
如果我把价值'和',它会告诉我,我会得到两个项目的折扣。
这个解决方案对我来说很好,直到现在,但我的大四学生要我避免使用字符串。我可以使用复选框(这不是问题!)。
棘手的部分从这里开始 -
让我们假设折扣是这样的 - 购买商品A,您将获得免费的两种(商品B +商品C),或者只获得(商品D +商品E)免费。
现在根据我目前的系统,我将插入四个条目;但我怎么知道表中的确切逻辑(哪两个项成对?)。
答案 0 :(得分:0)
我需要澄清您所做的以下陈述。
“购买物品A,您将获得免费的两种物品(物品B +物品C),或者免费物品(物品D +物品E)。”
只是项目D还是项目E?
最初我认为这可以通过某种类型的参照完整性来解决。
折扣表包含以下条目。
(Purchase Item, Free Item)
(A, B)
(A, C)
在[HappyHour_Menu_Subsequent]表和这两列之间创建外键关系。但是,这假定为1比1的关系。如果您开始捆绑项目,1对1或1对x,此解决方案将失败。
鉴于业务逻辑可能会发生变化,我们会想到两种解决方案。
1 - 如果应用程序确实直接插入和更新表,我会使用INSERT或UPDATE触发器来强制执行业务逻辑。
CREATE TRIGGER [TRG_ENFORCE_MY_HAPPY_HOUR_DEALS]
ON [HappyHour_Menu_Subsequent]
FOR INSERT, UPDATE
AS
BEGIN
-- put your logic here
IF (Violation)
RAISERROR();
END
违规只是占位符。您必须查看已插入和已删除的表以检索已购买的项目和免费项目。确保组合符合您的业务规则。
如果违反逻辑,前端是否处理错误。
2 - 如果您使用存储过程执行INSERTS或UPDATES,请在该代码中添加业务逻辑。
答案 1 :(得分:0)
在我看来,创建另一个名为 Group_Item 的表,该表将项目作为一对保存,对于您的示例,我们将有两行,一行包含 Item (B + C),一行包含 Item ( D + E )。如果这样实现,可以成对增加或减少项目长度,例如(B + C + D)或(C + F)。
如果不是像你上面说的那样只是一对:
<块引用>客户免费获得商品 A 或免费商品 B
我们将有两行,一行仅包含项目 A,另一行仅包含项目 B