2

我必须为连锁餐厅设计一个数据库。
情况如下 - 客户在购买项目 C 时获得免费项目 A 或免费项目 B(不是两者)。

以下是我的数据库中的两个表。
在此处输入图像描述


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

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

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

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

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

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

4

2 回答 2

0

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

“购买物品 A,您将免费获得(物品 B + 物品 C)或仅(物品 D + 物品 E)免费。”

是只有 D 项还是 E 项?

最初我认为这可以通过某种类型的参照完整性来解决。

折扣表具有以下条目。

(Purchase Item, Free Item)
(A, B)
(A, C)

在 [HappyHour_Menu_Subsequent] 表和这两列之间创建外键关系。但是,这假设是一对一的关系。如果您开始捆绑项目,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,请在该代码中添加业务逻辑。

于 2013-09-24T12:21:09.163 回答
0

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

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

客户可以免费获得 A 项或 B 项免费

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

于 2021-02-20T14:25:56.250 回答