数据库设计:产品和产品组合

时间:2011-11-04 13:01:04

标签: mysql database-design

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

  • 热狗
  • 苏打
  • 热狗+苏打水组合

我应该如何建模这样的东西?我应该有一个product表来列出单个产品,然后是一个描述组合的product_combo表,以及另一个与productproduct_combo相关联的表产品在组合中?这对我来说似乎很简单。

但是,如果我想将所有销售记录在一个表中,该怎么办?意思是,我不想要product_sales表和product_combo_sales表。我希望所有销售都只在一张桌子上。我有点不确定如何以这样的方式对产品和产品组合进行建模我以后可以将所有销售记录在一个表中。

建议?

注意:我想知道是否可以使用父子关系将产品和产品组合放在一个表中。有一张桌子,那么录制销售并不难。我必须实现一个业务规则,即当已经针对该组合记录销售时编辑产品组合,该编辑实际上导致新条目。但是可能会变得混乱。

3 个答案:

答案 0 :(得分:4)

这取决于您实际需要对系统执行的操作。需要跟踪库存的系统需要了解“组合餐”需要通过一个热狗和32盎司苏打(或其他)借记库存。然而,一个只跟踪订单和美元的系统并不真正关心组合餐的“进入” - 只是你卖掉了一个并得到了报酬。

那就是说,我们假设您需要库存系统。您可以通过稍微更改定义来降低复杂性。考虑(1)库存项目和(2)菜单项目。您的inventory_items表包含您购买和跟踪的商品(热狗,苏打水等)。您的menu_items表包含您销售的商品(Big Dog Combo Meal,Hot Dog(仅限三明治)等)。

您可以拥有一些菜单项,巧合的是,它们与库存项目具有相同的名称,但对于这些菜单项以与执行组合项目相同的方式处理它们并将单个记录粘贴到链接表:

 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

您需要对可选组件(酸菜,津津乐道,辣椒等)以及可从不同库存项目中选择的组件进行特殊处理(在此模型中表示为*苏打水),但这应该可以帮助您入门。< / p>

答案 1 :(得分:0)

我建议您考虑“订单”和“项目”。订单包含许多项目。物品可以是不同的“产品”。因此,订单的示例可以是:

1)热狗

2)苏打水

3)热狗+苏打水

项目的示例可以是:

A)热狗

B)苏打水

此外,您可以在订单表中保留销售额。 我认为您不需要在数据库中拥有“组合”的奖品。 这是应该在代码中应用的业务逻辑,而不是在数据库中。 您可以稍后在代码中应用所有折扣。

答案 2 :(得分:0)

你们的方法都可以。但至少还有一种方法可以解决问题,即将折扣应用于产品组合(这意味着您还可以选择性地分配折扣),例如。

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 */
);

但请记住,您需要使用程序代码来分配销售折扣(并标记每个售出的商品),以解决有人购买2个热狗的问题。一瓶苏打水(因此只能获得一折)。

...因此销售的总价格是

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=?