我正在存储来自多家餐馆的所有订单。(不是连锁店)这些餐馆有独特的商品,可能有也可能不属于同一类别(甜,咸,饮料,主菜,开胃菜等)子类别(甜 - >冻糕,绉;饮料 - >热,冷,酒等)
对于每个订单,可能有多个项目,具有自定义(删除或添加),并且特殊注释不是自定义的一部分。将数据序列化为json字符串将是一个简单的选择,但搜索和组织这些有价值的数据真的很难。
每个项目都包含可能与其类别中的其他项目相同或不同的部分。该项目包含每种可能组合的部分。所有默认部件均可选择退出。
让我们从一个例子开始吧。类别,子类别,常用选项,项目名称,唯一项目选项。并非所有级别都会被使用。
餐厅A
餐厅B
餐厅C
如果我去餐厅a,并订购一勺香草和巧克力,2个冷冻酸奶变种1,1个冷冻酸奶变种2没有b,还有一个带蘑菇的夏威夷比萨饼,我该如何储存这个订单?或者是使用sql错误的想法,我应该使用文档存储(nosql)系统?理想情况下,我不想将(默认)部件存储为自定义的一部分;只有不同的东西才有意思。
答案 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提供了一个叫做夏威夷人的比萨饼......这个数据有不同的用途(打印菜单,由厨师快速识别)而不是记录实际订购的内容(补给分析,成本分析,客户分析,以及您想做的任何其他事情)。
然而,所有这些都取决于您的使用案例(即使您太分享它们,我可能没有时间阅读它们并思考它们 - 这是您的工作!)。只要您提出的任何结构都支持用例,那么您就可以了。