Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 饭店食品可选折扣数据库设计_Sql_Sql Server_Database_Database Design - Fatal编程技术网

Sql 饭店食品可选折扣数据库设计

Sql 饭店食品可选折扣数据库设计,sql,sql-server,database,database-design,Sql,Sql Server,Database,Database Design,我必须为一家连锁餐厅设计一个数据库。 情况如下-当客户购买项目C时,可以免费获得项目A或项目B(不是两者都免费)。以下是my DB中的两个表。 对于上面的示例,我将在HappyHour_菜单_Trans中为项目C插入一个条目,该条目将生成一个新的HappyHourMenuTransId。 使用这个HappyHourMenuTransId,我将在HappyHour\u Menu\u后续表中插入两个条目 那么可选部分呢? 我可以考虑添加一列“条件”,在其中为两个条目都添加值“或”。这或将告诉我,我

我必须为一家连锁餐厅设计一个数据库。
情况如下-当客户购买项目C时,可以免费获得项目A或项目B(不是两者都免费)。以下是my DB中的两个表。


对于上面的示例,我将在HappyHour_菜单_Trans中为项目C插入一个条目,该条目将生成一个新的HappyHourMenuTransId。 使用这个HappyHourMenuTransId,我将在HappyHour\u Menu\u后续表中插入两个条目

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

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

棘手的部分从这里开始-


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


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

我需要澄清您所做的以下陈述


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

这只是D项还是E项?

起初我认为这可以通过某种类型的引用完整性来解决

折扣表包含以下条目

(Purchase Item, Free Item)
(A, B)
(A, C)
在[HappyHour_Menu_successive]表和这两列之间创建外键关系。然而,这假设了一种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-如果您使用存储过程执行插入或更新,请在该代码中添加业务逻辑。

我认为,创建另一个名为Group_Item的表,此表将以成对方式保存项,例如,我们将有两行,一行包含项(B+C),一行包含项(D+E)。如果这样实现,您可以增强项目长度或成对减少,例如(B+C+D)或(C+F)

如果不是一对,只需一件物品,如您上述所述:

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


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

您有设计数据库的经验吗?如果不是的话,我强烈建议你选一本关于它的书。看起来你是在围绕应用程序创建数据库,而不是围绕数据库创建应用程序。@FreshPrinceOfSO先生,恐怕我不明白。我正在围绕应用程序创建数据库。如果你说这不是正确的方法,那么你能给我推荐一本书吗?数据驱动设计,将数据库设计放在首位,是我们这些以数据库设计为生的人的首选,但它远不是唯一有效的方法。有许多有效的应用程序驱动的设计方法,它们将客户端应用程序设计放在首位,然后要求我们的DB开发人员提出一个数据库设计来支持它。您可能希望/需要对可能的折扣及其结构设置某种复杂度限制。设计表以支持几乎无限复杂的折扣结构非常简单。设计查询以返回所有内容稍微有些困难。但是编写代码来使用这些信息,计算出我们的逻辑含义,然后将其全部应用到订单上要困难得多,尤其是这些折扣可能越复杂。购买商品a,您将免费获得(商品B+商品C)或仅免费获得(商品D+商品E)。这意味着如果你买了A,你可以得到A,B,C(免费的)或A,D,E(免费的)