比方说我在卖一些product。有时,product实际上是其他product的组合。例如,假设我出售的是:
dog
我该怎么做这样的模特儿?我是否应该有一个product表来列出各个产品,然后是一个描述该组合体的product_combo表,另一个与product和product_combo关联的表来逐项列出组合中的产品?我觉得这很简单。
但是,如果我想把所有的销售记录在一个表中呢?意思是,我不想要product_sales表和product_combo_sales表。我希望所有的销售都排在一张桌子上。我有点不确定如何建模产品和产品组合,这样的话,我可以记录所有的销售在一个表。
有什么建议吗?
注意:我想知道我是否可以使用父子关系将产品和产品组合放在一个表中。只有一张桌子,那么记录销售就不难了。我只需实现一条业务规则,即在已经记录销售时编辑产品组合,而编辑实际上会导致一个新条目。不过,可能会很乱。
发布于 2011-11-04 13:15:19
这取决于您实际需要如何处理您的系统。一个需要跟踪库存的系统将需要理解“组合餐”需要通过一个热狗和32盎司的苏打水(或其他什么)来借记库存。然而,一个只跟踪订单和美元的系统并不真正关心“进入”套餐--只是你卖掉了一顿,并为此得到了报酬。
尽管如此,让我们假设您需要库存系统。您可以通过稍微修改定义来降低复杂性。考虑(1)库存项目和(2)菜单项。您的inventory_items表包含您作为库存(热狗、苏打水等)购买和跟踪的项目。您的menu_items表包含您出售的物品(“大狗组合餐”、“热狗”(仅限三明治)等)。
您可以有一些菜单项,巧合的是,这些菜单项的名称与库存项相同,但对于这些菜单项,您可以像对待组合项一样对待它们,并将一条记录放入链接表中:
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_items到recipes,(如果需要其他字段)到inventory_items。
您需要对可选组件(酸菜、调味品、辣椒等)和可以从不同库存项目中选择的组件(在此模型中表示为*纯碱)进行特殊处理,但这将使您开始工作。
发布于 2011-11-04 13:32:50
你俩的方法都没问题。但是至少还有一个解决问题的方法,那就是将折扣应用于产品组合(这意味着你也可以有选择地分配折扣)。
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
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=?https://stackoverflow.com/questions/8009545
复制相似问题