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(免费的)