繁体   English   中英

餐厅食品可选折扣的数据库设计

[英]Database design for optional discount on food items of a restaurant

我必须为一家连锁餐厅设计一个数据库。
情况如下 - 客户购买物品 C 时,要么免费获得物品 A,要么免费获得物品 B(不是两者都免费)。

以下是我的数据库中的两个表。
在此处输入图片说明


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

那么可选部分呢?
我可以考虑添加一个“条件”列,我将在其中为两个条目输入值“或”。 这个 OR 会告诉我我只能选择一个选项。
如果我输入值“AND”,它会告诉我这两个项目都将获得折扣。

到目前为止,这个解决方案对我来说很好,但我的前辈希望我避免使用字符串。 我可以使用复选框(这不是问题!)。

棘手的部分从这里开始——

假设折扣是这样的 - 购买物品 A,您将同时获得(物品 B + 物品 C)免费,或仅(物品 D + 物品 E)免费。

现在根据我当前的系统,我将插入四个条目; 但是我如何从表格中知道确切的逻辑(哪两个项目是一对?)。

我需要澄清您所做的以下声明。

“购买物品 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,请在该代码中添加业务逻辑。

在我看来,创建另一个名为 Group_Item 的表,该表将项目作为一对保存,对于您的示例,我们将有两行,一行包含 Item (B + C),一行包含 Item (D + E)。 如果这样实现,你可以成对增加或减少项目长度,例如(B + C + D)或(C + F)。

如果不是一对,就像你上面说的那样,只有一个项目:

客户获得免费的物品 A 或免费的物品 B

我们将有两行,一行仅包含项目 A,另一行仅包含项目 B

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM