多个餐厅的sql数据库设计

时间:2014-06-18 09:34:55

标签: sql database-design

我正在存储来自多家餐馆的所有订单。(不是连锁店)这些餐馆有独特的商品,可能有也可能不属于同一类别(甜,咸,饮料,主菜,开胃菜等)子类别(甜 - >冻糕,绉;饮料 - >热,冷,酒等)

对于每个订单,可能有多个项目,具有自定义(删除或添加),并且特殊注释不是自定义的一部分。将数据序列化为json字符串将是一个简单的选择,但搜索和组织这些有价值的数据真的很难。

每个项目都包含可能与其类别中的其他项目相同或不同的部分。该项目包含每种可能组合的部分。所有默认部件均可选择退出。

让我们从一个例子开始吧。类别,子类别,常用选项,项目名称,唯一项目选项。并非所有级别都会被使用。

餐厅A

    • 冰淇淋
      • #sooops(如果> 1,可能有多种口味)
      • 香草
      • 巧克力
      • 芒果
    • 冷冻酸奶
      • 变种1
        • a(默认)
        • b(默认)
        • C
        • d
        • ë
      • 变种2
        • a
        • b(默认)
        • C
        • d(默认)
        • ë
      • 变种3
        • a(默认)
        • b(默认)
        • C
        • d
        • e(默认)
  • 咸味
    • 比萨饼
      • 夏威夷
        • 菠萝(默认)
        • 奶酪(默认)
        • ham(默认)
        • 番茄酱(默认)
        • 熏肉
        • 蘑菇
        • 香肠
      • 创建自己的
        • 菠萝
        • 干酪
        • 火腿
        • 番茄酱
        • 熏肉
        • 蘑菇
        • 香肠
  • 饮料
      • 咖啡
      • 拿铁
      • 卡布奇诺
      • 焦炭
      • 瓶装水
      • 冰咖啡/茶的变化

餐厅B

    • item x
    • item y
    • item z
  • 咸味
    • 项目w
    • item q
  • item r

餐厅C

  • item o
  • item p
  • item g
  • item s

如果我去餐厅a,并订购一勺香草和巧克力,2个冷冻酸奶变种1,1个冷冻酸奶变种2没有b,还有一个带蘑菇的夏威夷比萨饼,我该如何储存这个订单?或者是使用sql错误的想法,我应该使用文档存储(nosql)系统?理想情况下,我不想将(默认)部件存储为自定义的一部分;只有不同的东西才有意思。

2 个答案:

答案 0 :(得分:2)

了解信息建模和关系模型。

您应用程序的简单信息模型是最好的开始。 (实际上,对于任何编程问题。)你可能实际上应该使用关系DBMS。

您需要了解信息建模(IM)。还有关系模型(RM)和(排序)关系数据库管理系统(RDBMS)。 IM可以精确地使用RM。请参阅this回答。尤其是它的第一个环节另请参阅我对建模问题的答案。

RM允许通过自动实现进行通用的无循环/声明(逻辑符号)查询和操作,并具有某些优化的特定性能。应该仅使用任何其他数据结构或语言,因为特定查询和性能的工程权衡。这对于每个计算任务都是如此。 (任何程序的精确规范都可以用逻辑表示法编写。)

你现在可以停下来。但RM的思维方式如下。

查找申请关系声明。

基本思路是找到描述应用情况的陈述。

I go to restaurant a, and order
    a double scoop of vanilla and chocolate,
    2 frozen yogurt variation 1, 1 frozen yogurt variation 2 with no b, and
    a hawaiian pizza with mushrooms

制作填空版本。

    person [p] at restaurant [r] has some pending order o
AND o includes item some item i
AND item i is an ice cream
AND item i has [n] scoops of flavour [f]
...
AND order o includes some item j
AND item j is a pizza
AND item j base is hawaiian
AND item j has extra [mushrooms]

查找基本陈述。

person [p] at restaurant [r] has pending order [o]
order [o] includes item an item i
item [i] is an ice cream
item has [n] scoops of flavour [f]
...
item [j] is a pizza
item [i] has base [b]
base [b] has topping [t]
item [i] has extra topping [t]
item [i] has topping [t]

基表有一个声明。

每个基本语句都有一个基表。基表声明看起来像它的声明的简写&反之亦然。

order(p,r,o) -- person [p] at restaurant [r] has pending order [o]
base(b,t) -- base [b] has topping [t]
topping(i,t) -- item [i] has topping [t]

基表包含使其成立的行。例如,在以下情况

    person No_name at restaurant a placed order 12345
AND person philipxy at restaurant a placed order 22222
AND person philipxy at restaurant b placed order 33333
AND for all other (p,r,o) NOT order(p,r,o)

基表

order(p,r,o) -- person [p] at restaurant [r] has pending order [o]

具有表格的值

+----------------------+
| p        | r | o     |
+======================+
| No_name  | a | 12345 |
+----------------------+
| philipxy | a | 22222 |
+----------------------+
| philipxy | b | 33333 |
+----------------------+

找到最佳基本语句和表的RM方法是规范化(到5NF)。

每个表都有一个声明

由其他陈述组成的每个陈述都有一个表格。每个表都包含使其语句成立的行。该语句由逻辑运算符组合而成,表由相应的表运算符组合/计算。

例如行

there's some restaurant r, order o and item i where:
    person [p] at restaurant [r] has pending order [o]
AND order [o] includes item [i]
AND item [i] has [n] scoops of flavour [f]
AND [p]=No_name AND [r]=a

或使用短缺行

EXISTS r,o,i: order(p,r,o) AND item(o,i) AND cone(i,n,f) AND p=No_name AND r=a

中的行
SELECT p,n,f
FROM order JOIN item JOIN cone
WHERE order.o=item.o AND item.i=cone.i
AND order.p=No_name AND r=a

+--------------------------+
| p        | n | f         |
+==========================+
| No_name  | 1 | vanilla   |
+--------------------------+
| No_name  | 1 | chocolate |
+--------------------------+

从陈述开始。即应用关系。即关系。因此关系模型。

<强>唉。

你得到的所有建模建议可能都会讨论“一个”“m:n”“关联”[应用程序关系],而不会询问哪一个。即哪个陈述。 (注意他们将以非日常非RM方式使用“关系”。)

实体 - 关系建模(ERM)和对象 - 关系映射/建模(ORM)误解了RM。他们混淆了上述情况。但是你可以从上面转换成他们的观念。

答案 1 :(得分:0)

我不会尝试对SQL vs NoSQL发表评论,除非说这种类型的应用程序可能是SQL的一个不可或缺的应用程序;最终的架构取决于您打算如何使用数据。

我说在您存储的方式与呈现数据的方式之间存在分歧。对于例如一个带有额外蘑菇的夏威夷人,你想要呈现给厨房的是(可能是)夏威夷+额外的蘑菇&#39;。什么可能最好的存储是菠萝,奶酪,火腿,番茄酱,蘑菇&#39;披萨。

我认为你想通过餐厅和时间(口味变化,食谱变化)存储各种标准组合:从时间T1到T2休息A提供了一个叫做夏威夷人的比萨饼......这个数据有不同的用途(打印菜单,由厨师快速识别)而不是记录实际订购的内容(补给分析,成本分析,客户分析,以及您想做的任何其他事情)。

然而,所有这些都取决于您的使用案例(即使您太分享它们,我可能没有时间阅读它们并思考它们 - 这是您的工作!)。只要您提出的任何结构都支持用例,那么您就可以了。