使用股票期权进行库存管理
Posted
技术标签:
【中文标题】使用股票期权进行库存管理【英文标题】:Inventory management with stock options 【发布时间】:2014-01-27 09:58:08 【问题描述】:我正在尝试创建一个库存管理架构,我可以在其中跟踪与产品相关的各种选项的库存。一个产品可能有任意数量的选项,但在本例中,我将使用“尺寸”和“颜色”选项。
我想出了三个表:
CREATE TABLE shop_options (
option_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
option_name VARCHAR(40) NOT NULL,
PRIMARY KEY (option_id)
);
INSERT INTO shop_options (option_id, option_name) VALUES (1, 'Size');
INSERT INTO shop_options (option_id, option_name) VALUES (2, 'Color');
CREATE TABLE shop_option_properties (
prop_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
prop_name VARCHAR(40) NOT NULL,
PRIMARY KEY (prop_id)
);
INSERT INTO shop_option_values (prop_id, prop_name) VALUES (1, 'XS');
INSERT INTO shop_option_values (prop_id, prop_name) VALUES (2, 'S');
INSERT INTO shop_option_values (prop_id, prop_name) VALUES (3, 'M');
INSERT INTO shop_option_values (prop_id, prop_name) VALUES (4, 'L');
INSERT INTO shop_option_values (prop_id, prop_name) VALUES (5, 'XL');
INSERT INTO shop_option_values (prop_id, prop_name) VALUES (6, 'White');
INSERT INTO shop_option_values (prop_id, prop_name) VALUES (7, 'Black');
INSERT INTO shop_option_values (prop_id, prop_name) VALUES (8, 'Red');
INSERT INTO shop_option_values (prop_id, prop_name) VALUES (9, 'Green');
INSERT INTO shop_option_values (prop_id, prop_name) VALUES (10, 'Blue');
CREATE TABLE shop_product_options (
product_id INTEGER UNSIGNED NOT NULL,
option_id INTEGER UNSIGNED NOT NULL,
prop_id INTEGER UNSIGNED DEFAULT NULL,
surcharge DECIMAL(7,2) NOT NULL DEFAULT '0.00',
stock INTEGER UNSIGNED DEFAULT NULL, /* NULL = stock is not limited */
FOREIGN KEY (product_id)
REFERENCES shop_products(product_id),
FOREIGN KEY (option_id)
REFERENCES shop_options(option_id),
FOREIGN KEY (prop_id)
REFERENCES shop_option_properties(prop_id)
);
我已经确定这行不通,因为我的库存中可能有“总共十个小物品”和“总共十个白色物品”,但没有“总共十个白色小物品”的库存。
如何改进我的架构以正确跟踪产品可能具有的每个选项的库存?
编辑
我将以下更新包括在内,以供与我遇到同样问题的其他人使用。一开始我发现接受的答案很难理解。基本上,我可以通过对shop_product_options
表进行以下修改来保留上面的架构:
CREATE TABLE shop_product_options (
po_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
product_id INTEGER UNSIGNED NOT NULL,
option_id INTEGER UNSIGNED NOT NULL,
prop_id INTEGER UNSIGNED NOT NULL,
surcharge DECIMAL(7,2) UNSIGNED NOT NULL DEFAULT '0.00',
stock INTEGER UNSIGNED DEFAULT NULL,
PRIMARY KEY (po_id, product_id, option_id, prop_id),
FOREIGN KEY (product_id)
REFERENCES shop_products(product_id),
FOREIGN KEY (option_id)
REFERENCES shop_options(option_id),
FOREIGN KEY (prop_id)
REFERENCES shop_option_properties(prop_id)
);
将添加的po_id
和组合键作为主键,我现在可以插入和提取“分组”数据,如下所示:
INSERT INTO shop_products (product_id, title) VALUES (1, 'Womens Shoe');
INSERT INTO shop_product_options (po_id, product_id, option_id, prop_id, surcharge, stock)
VALUES (1, 1, 1, 3, '0.00', 10);
INSERT INTO shop_product_options (po_id, product_id, option_id, prop_id, surcharge, stock)
VALUES (1, 1, 2, 9, '0.50', 20);
INSERT INTO shop_product_options (po_id, product_id, option_id, prop_id, surcharge, stock)
VALUES (2, 1, 1, 5, '1.00', 30);
INSERT INTO shop_product_options (po_id, product_id, option_id, prop_id, surcharge, stock)
VALUES (2, 1, 2, 9, '0.75', 40);
SELECT t1.po_id, t2.title, t3.option_name, t4.prop_name, t1.surcharge, t1.stock FROM shop_product_options AS t1
JOIN shop_products AS t2 ON t1.product_id = t2.product_id
JOIN shop_options AS t3 ON t1.option_id = t3.option_id
JOIN shop_option_properties AS t4 ON t1.prop_id = t4.prop_id
WHERE t1.product_id = 1 ORDER BY t1.po_id ASC;
这导致了 M 码绿色女鞋和 XL 码绿色女鞋,每种鞋的尺码和颜色都有不同的库存数量。
【问题讨论】:
你可以从here开始。 @ChristianMark 你能说得更具体点吗?我浏览了该页面上的一半链接,但尚未找到与我的问题相关的链接。 【参考方案1】:我认为模型草案(following 6NF 和 3NF)会对您有所帮助。 我通过删除“shop”关键字简化了命名约定。 (商店实体也可能领导一个单独的概念 AKA SaaS)SqlFiddle Demo
关于 cmets 中的问题:
是否可以有唯一的产品 ID
是的,在您的桌子上使用surrogate identifier 是一种常见的模式。正如您在文章中看到的那样,这将带来优缺点。
例如,在问题中,您会看到ProductSpecification
表的主键是ProductTypeOptions
、OptionValue
和Product
外键的组合。 同时其他表的主键如@ 987654331@ 是一个复合键 (OptionId + ValueName
)
看起来生活会更容易在每个表中都有一个 ID
字段作为主键,是的,但作为数据库设计人员,你会失去一些有价值的东西,业务逻辑。
在当前设计中,您可以在 Product-Specification 表中设置这些约束,它们将显示您的部分业务逻辑:
ProductSpecification
OptionValue.optionId =
productTypeOption.optionId
上的约束,这将阻止像“White”这样的值
被分配到“尺寸”。
检查ProductSpecification
product.productTypeId =
productTypeOption.productTypeId
上的约束,这将阻止类似的产品
“Nike”被分配给“Cars”的productSpecifications。
如果您使用代理标识符,则您的数据库中不能有这些类型的约束(试试这个)。 需要在您的应用程序实现中完成额外的工作才能获得它们。 顺便说一句use surrogate identifier, check data consistency,如果更感兴趣,请参阅choosing a Primary Key: Natural or Surrogate。
底价、库存和附加费应该去哪里?
看来“耐克”的“男鞋”需要有价格、库存和附加费,所以它们是Product
table 的自然财产。
【讨论】:
您介意提供一个关于如何实现此架构的真实示例吗?仅凭图表我不能完全确定表格之间的关系,或者您将库存数量与产品选项相关的位置。 我添加了一些 sqlfiddle 演示,这有帮助。 #1 product_type 和 Spec 表是选项组合发生的地方,这是一个设计级别的概念,我不喜欢用它作为业务级别的表,category 是一个业务概念,所以创建一个新的表,叫做 categories,根据业务角色,一个多对多表 product_category 或 product_type_category 就可以了。 #2 我建议的模型只是一个可视化设计的草稿,请随意扩展它,正如您提到的产品表,必须扩展。 注意: Spec 表中的日期字段是向产品类型添加(删除)选项的日期(用于历史使用),它们不是业务字段。 我已经编辑了我的原始问题,并解释了您的答案。你太棒了,非常感谢!【参考方案2】:这里有一些东西可以帮助你开始......
每种独特的项目类型都应该有自己的SKU(参见示例 4),因此您可以像这样设计您的数据库:
colors
id unsigned int(P)
description varchar(10)
+----+-------------+
| id | description |
+----+-------------+
| 1 | White |
| 2 | Blue |
| 3 | Green |
| .. | ........... |
+----+-------------+
items
id unsigned int(P)
description varchar(20)
+----+-------------+
| id | description |
+----+-------------+
| 1 | T-shirt |
| 2 | Pencil |
| .. | ........... |
+----+-------------+
sizes
id unsigned int(P)
description varchar(10)
+----+-------------+
| id | description |
+----+-------------+
| 1 | Small |
| 2 | Medium |
| 3 | Large |
| .. | ........... |
+----+-------------+
在 SKU 下面的示例数据中,S1C1I1
是一件白色的小 T 恤,S2C3I1
是一件绿色的中号 T 恤。
products
id unsigned int(P)
sku varchar(50)
price double
quantity unsigned int
+----+--------+-------+----------+
| id | sku | price | quantity |
+----+--------+-------+----------+
| 1 | S1C1I1 | 10.00 | 312 |
| 2 | S2C3I1 | 11.00 | 52 |
| .. | ...... | ..... | ........ |
+----+--------+-------+----------+
您的产品表中可能还有 UPC、EAN 等。
【讨论】:
感谢您的反馈,尽管我不确定我是否了解 SKU 与存储数据有何关系,因为这些数据可能会在可能定义自己的公司之间发生变化。它并不完全灵活。您还将尺寸和颜色硬编码到单独的表格中,但根据我的示例,我可能无法提前知道这些选项和相关属性将是什么。 @mistermartin - 您需要为您的问题添加一些详细信息。例如,您应该添加您想要跟踪来自除您自己之外的多家公司的产品。你如何获得他们的股票信息?您可以使用 UPC 或 EAN 代码代替 SKU,因为它们是唯一的,即使跨多个公司也是如此。 如果一家公司销售的是定制产品,它可能没有 UPC 或 EAN。我真的不认为你所要求的细节与这个问题有关,但如果你认为我错过了你想要表达的观点,我很开放并愿意倾听。问题是如何在不提前知道这些选项是什么的情况下跟踪具有多个选项的库存。我的模式显然不起作用;什么会起作用?股票信息来自哪里并不重要,重要的是它是如何存储的。就我而言,SKU、UPC、EAN 等都应该是可选的。以上是关于使用股票期权进行库存管理的主要内容,如果未能解决你的问题,请参考以下文章
java计算机毕业设计springboot+vue股票交易模拟系统