数据库设计,用于餐馆食品的可选折扣

时间:2013-09-24 11:18:40

标签: sql sql-server database database-design

我必须为餐馆连锁店设计一个数据库。
情况如下 - 当他购买物品C时,顾客获得物品A免费或物品B免费(不是两者)。
以下是我的DB中的两个表。 br /> enter image description here


对于上面的示例,我将在HappyHour_Menu_Trans中插入项目C的条目,该条目将生成新的HappyHourMenuTransId。 使用此HappyHourMenuTransId,我将在HappyHour_Menu_Subsequent表中插入两个条目。

现在可选部分呢? 我可以考虑添加一个“条件”列,其中我将为两个条目设置值“OR”。这个OR会告诉我,我只能选择一个选项。
如果我把价值'和',它会告诉我,我会得到两个项目的折扣。

这个解决方案对我来说很好,直到现在,但我的大四学生要我避免使用字符串。我可以使用复选框(这不是问题!)。

棘手的部分从这里开始 -

让我们假设折扣是这样的 - 购买商品A,您将获得免费的两种(商品B +商品C),或者只获得(商品D +商品E)免费。

现在根据我目前的系统,我将插入四个条目;但我怎么知道表中的确切逻辑(哪两个项成对?)。

2 个答案:

答案 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

相关问题