首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎么把这些桌子组合起来?

我怎么把这些桌子组合起来?
EN

Database Administration用户
提问于 2018-04-29 03:46:33
回答 2查看 173关注 0票数 0

我的系统和饮料一起工作,现在我已经准备好添加汉堡和其他种类的东西了。

现在,对于每种类型的项目,我都有一个带有单独项目和项目订单表的订单表。

这是不够的,因为很难将项目合并为一个订单。

你能提出更好的方法吗?我很困惑如何组合它们,因为饮料和汉堡有不同的选择,当我将增加越来越多的项目时,我希望有更多的选择。

最有效的方法是什么?

编辑1:

我将项目表、项目订单表组合在一起,并添加了一个包含价格和附加费信息的表,这样就不会经常存储。

我觉得它还可以改进。

编辑2:

我决定删除所有的枚举(感谢Vérace和sibert),并且我已经改进了我的价格结构(感谢Lennart),但我仍在试图确定价格表及其关系是否尽可能好。项目订单表现在指的是价格,因此我认为它将允许我以准确的价格正确地检索历史项目。

我仍然觉得它可以改进。

EN

回答 2

Database Administration用户

发布于 2018-04-29 08:17:08

经验法则1:如果表包含将来可能更改(编辑、删除或添加列)的内容,那么它可能属于数据级别。

经验法则2:每张桌子都要有一个独特的钥匙。如果每一行都有一个唯一的键,那么编辑顺序记录就更简单了。

经验法则3:拇指规则并不总是最好的方法。这总是取决于..。

一种构造这一结构的方法:

article_type

代码语言:javascript
复制
type_id   1          2         3
type_desc Burger     Drink     Extra stuff

编辑1-->你不需要有饮料类别。你可以有汉堡包大,喝得太多等几种类型。这篇文章是收集所有信息的王者。选择文章,您就有了所需的所有信息。

文章

代码语言:javascript
复制
art_id    1              2               3             4
art_desc  Burger Big     Burger Small    Burger King   Drink little
art_type  1              1               1             2
art_price 50             40              60            10

编辑2价格应附在物品上。这也意味着order表中少一列。

代码语言:javascript
复制
order_id     11
order_status 1 (int) Lookup table
order_date   2018-01-01

order_rec

代码语言:javascript
复制
ordrec_id    1
ordrec_order 11
ordrec_art   1
ordrec_sum   50

当你拿到订单时,你可以随心所欲地加起来.不需要在订单级别上保存sum。

代码语言:javascript
复制
SELECT order_id,sum(ordrec_sum)
LEFT JOIN order_rec ON ordrec_order=order_id
GROUP BY 1
WHERE order_id=11

如果您在文章中添加更多的组餐,article_type可能会很有用。

票数 1
EN

Database Administration用户

发布于 2018-04-29 09:31:01

我认为第二个编辑的模式太复杂了。看看这个简化的版本,如果从您的角度来看仍然存在问题,请告诉我:

代码语言:javascript
复制
CREATE TABLE category
(
  category_id INTEGER PRIMARY KEY,
  category_name VARCHAR(25) NOT NULL -- ex. Burger, could be Small Burger &c.
);  

然后还有其他桌子:

代码语言:javascript
复制
CREATE TABLE order_  -- note TRAILING underscore, order is an sql keyword, always worth avoiding even though certain systems have tricks whic allow you to use the - NEVER DO THIS!
(
  order_id INTEGER PRIMARY KEY,
  table_id INTEGER NOT NULL, -- no FK, could be "bar" or "special", i.e banquet
  main_server INTEGER NOT NULL, -- FK to staff table
  final_bill DECIMAL(5,2) NOT NULL, but can be 0 for special arrangement
  order_note text -- notes good or bad (ex. food sent back)
  order_final_bill -- computed/virtual field
);  

CREATE TABLE order_item
(
  item_id INTEGER NOT NULL, -- FK to item table
  item_category NOT NULL, -- FK to category table
  item_desc VARCHAR(25) NOT NULL,  -- FK to item table
  item_price DECIMAL(5,2) NOT NULL,  
  item_cuisson VARCHAR(50),  -- how item is cooked, i.e rare &c.
  item_note TEXT  -- extra info, allergies, change of sauce &c.
);

不知道为什么你想要一个项目价格的历史线索-餐馆通常是快速的这是极大的兴趣-季节性变化的价格,时尚。价格甚至可以在每周的基础上确定,例如圣诞节前后,然后进入新年(安静时间)。

我将有一个old_price表,当一个项目修改价格时,使用触发器将item_id、price_date_from和price_date_to放入如下:

代码语言:javascript
复制
CREATE TABLE old_price
(
  item_id INTEGER NOT NULL, 
  item_price DECIMAL(5,2) NOT NULL,
  price_date_from DATE NOT NULL,
  price_date_to DATE NOT NULL
);

另一些东西--有时同一菜在同一天的不同时间(午餐时间或晚餐)有不同的价格,甚至在同一种服务中也有不同的价格,这取决于它是在固定菜单上还是在点菜上。我想,再一次,这里出现了过度并发症。一位经理/老板在周一早上定价,他不会真正关心3周前的价格。他们所关心的只是本周他们为货物支付了多少钱,以及营业额是多少。只是一些想法,不要模糊雅格尼

祝你的项目好运。你也可以使用搜索引擎来查看开源餐厅系统,看看你能学到什么!

附注:SQL是未经测试的(逗号、分号) &c。最后,如果这是一个新项目,我强烈建议您查看PostgreSQL而不是MySQL --它是一个非常优秀的数据库!

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/205274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档