首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据库设计:产品与产品的结合

数据库设计:产品与产品的结合
EN

Stack Overflow用户
提问于 2011-11-04 13:01:04
回答 2查看 3.1K关注 0票数 6

比方说我在卖一些product。有时,product实际上是其他product的组合。例如,假设我出售的是:

dog

  • soda

  • hot
  • 热狗+苏打组合

我该怎么做这样的模特儿?我是否应该有一个product表来列出各个产品,然后是一个描述该组合体的product_combo表,另一个与productproduct_combo关联的表来逐项列出组合中的产品?我觉得这很简单。

但是,如果我想把所有的销售记录在一个表中呢?意思是,我不想要product_sales表和product_combo_sales表。我希望所有的销售都排在一张桌子上。我有点不确定如何建模产品和产品组合,这样的话,我可以记录所有的销售在一个表。

有什么建议吗?

注意:我想知道我是否可以使用父子关系将产品和产品组合放在一个表中。只有一张桌子,那么记录销售就不难了。我只需实现一条业务规则,即在已经记录销售时编辑产品组合,而编辑实际上会导致一个新条目。不过,可能会很乱。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-04 13:15:19

这取决于您实际需要如何处理您的系统。一个需要跟踪库存的系统将需要理解“组合餐”需要通过一个热狗和32盎司的苏打水(或其他什么)来借记库存。然而,一个只跟踪订单和美元的系统并不真正关心“进入”套餐--只是你卖掉了一顿,并为此得到了报酬。

尽管如此,让我们假设您需要库存系统。您可以通过稍微修改定义来降低复杂性。考虑(1)库存项目和(2)菜单项。您的inventory_items表包含您作为库存(热狗、苏打水等)购买和跟踪的项目。您的menu_items表包含您出售的物品(“大狗组合餐”、“热狗”(仅限三明治)等)。

您可以有一些菜单项,巧合的是,这些菜单项的名称与库存项相同,但对于这些菜单项,您可以像对待组合项一样对待它们,并将一条记录放入链接表中:

代码语言:javascript
复制
 inventory_items            menu_items       recipes (menu_item, inventory, qty)
 ---------------            ------------     ----------
 hot dog                    Hot Dog          Hot Dog, hot dog, 1
 hot dog bun                Hamburger        Hot Dog, hot dog bun, 1
 hamburger patty (4oz)      Big Dog Combo    Hamburger, hamburger patty (4oz), 1
 hamburger bun              Soda (32oz)      Hamburger, hamburger bun, 1
 cola                                        Big Dog Combo, hot dog, 1
 ginger ale                                  Big Dog Combo, hot dog bun, 1
                                             Big Dog Combo, *soda, 32
                                             Soda (32oz), *soda, 32

只要构造这个例子,就会发现即使是低端的热狗也有两个成分(你必须数一下面包),而不仅仅是一个。为了想出最简单的情况(带有单个组件的菜单项),我在菜单中添加了Soda。然而,考虑一下,如果你要盘点非食品物品(杯子),那么即使是一个简单的苏打水也会有两个组成部分(如果你在清点吸管的话,就有三个)。

请注意,使用此设计,将没有处理组合项和非组合项的特殊代码页。所有菜单相关功能将只使用menu_items表,所有库存和食品准备相关功能将JOIN menu_itemsrecipes,(如果需要其他字段)到inventory_items

您需要对可选组件(酸菜、调味品、辣椒等)和可以从不同库存项目中选择的组件(在此模型中表示为*纯碱)进行特殊处理,但这将使您开始工作。

票数 4
EN

Stack Overflow用户

发布于 2011-11-04 13:32:50

你俩的方法都没问题。但是至少还有一个解决问题的方法,那就是将折扣应用于产品组合(这意味着你也可以有选择地分配折扣)。

代码语言:javascript
复制
CREATE TABLE products
(
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(128),
  description TEXT,
  price INT
);
CREATE TABLE combo_discounts
(
  id NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(128),
  description TEXT
);
CREATE TABLE cd_products
(
  cd_id INT /* REFERENCES combo_discounts.id */,
  p_id INT /* REFERENCES product.id */
  price_reduction INT
);
CREATE TABLE sales
(
  id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  location ...whatever...
);
CREATE TABLE sales_items
(
  sale_id INT /* REFERENCES sales.id */
  p_id INT /* REFERENCES product.id */
  cd_discount INT /* REFERENCES cd_products.cd_id */
);

但是,请记住,您需要使用程序代码来分配折扣(并在销售过程中标记每个销售项目),以解决某人购买两个热狗和一个苏打水(因此只能得到一个折扣)的问题。

因此,一次出售的总价格是...and

代码语言:javascript
复制
SELECT SUM(p.price)-SUM(cd.price_reduction)
FROM sales s INNER JOIN sales_items si ON (si.sale_id=s.id)
   LEFT JOIN cd_products cdp ON (si.cd_discount = cdp.cd_id
      AND si.p_id=cdp.p_id)
AND s.id=?
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8009545

复制
相关文章

相似问题

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