【发布时间】:2021-05-03 13:19:34
【问题描述】:
我需要创建一个数据库来保存订单以及每个订单的商品。
这将是传统的桌子设置
订单表
| Id (pk) | CustomerId (fk) |
|---|---|
| 1 | 1 |
物品表
| Id (pk) | OrderId (fk) | StatusId (fk) | Quantity |
|---|---|---|---|
| 1 | 1 | 1 | 1000 |
项目状态表
(不用担心数据如何知道哪个状态是第一、第二、第三等)
| Id (pk) | Name | Description | IsStart | IsTerminal |
|---|---|---|---|---|
| 1 | New | For newly created items | 1 | 0 |
| 2 | Materials Ordered | For indicating that raw materials are ordered | 0 | 0 |
| 3 | Pre-Fabrication | For receiving materials and gathering other resources | 0 | 0 |
| 4 | In Work | For indicating that the assembly process is underway | 0 | 0 |
| 5 | Staging | For preparing the items for shipping | 0 | 0 |
| 6 | Shipped | For indicating that items are complete and no longer in the facility | 0 | 1 |
然而
我需要将上述数量 1000 并按状态细分,因为它与业务工作流有关。
我最初的实现看起来像这样,但我想联系一下,看看是否有更好的设计。
修改项目表
| Id (pk) | OrderId (fk) |
|---|---|
| 1 | 1 |
数量明细表
| Id (pk) | OrderItemId (fk) | StatusId (fk) | Quantity |
|---|---|---|---|
| 1 | 1 | 2 | 200 |
| 2 | 1 | 3 | 200 |
| 3 | 1 | 4 | 400 |
| 4 | 1 | 5 | 200 |
编辑
以下是一些通俗易懂的示例,有助于阐明预期的解决方案。所有场景都将通过只有一个项目来简化。此外,订购材料的处理超出了范围;我只需要知道该项目正在等待。
在这些示例中,我们将处理汉堡(项目 #1)的创建过程。在更高级的场景中,我们可以添加另一个项目,例如薯条(即项目 #2)
示例 1
使用 1 个汉堡创建餐厅订单。组装汉堡所需的所有材料都在手边;因此,汉堡将通过所有数量的状态(新 => 准备 => 烹饪 => 包装 => 交付)。
示例 2
创建了包含 2 个汉堡的餐厅订单。手头只有一个汉堡的足够材料;因此,需要拆分项目数量。由于我们不希望客户等待,所以第一个汉堡将通过数量为 1 的状态进行。而第二个汉堡将不得不等待一个名为 Pending 的新状态。然后一旦材料可用,第二个汉堡可能会继续工作流程。
【问题讨论】:
-
对此的标准设计通常是 Orders Many to Many to Inventory Items 包含数量。这个多对多是通过一个包含两个键的关联表 OrderItems 来解决的。 Orders 是 Customer 的子级。库存中的数量和 OrderItems 中的每次销售都会耗尽,并由采购订单、申请等补充。我不确定我理解 QuantityBreakDown 表在您的场景中的用途。您的工作流程很好,但您可能需要汇总到订单标题的状态,除非您每个订单只有一件商品。
-
@Chuma 在这种情况下,项目特定于一对多的订单。想象一下,当您从零售商处批量订购商品时。然后您订购了 1000 件商品。然而,他们手头只有500个。因此,零售商将继续运送前 500 件商品(它们的状态为已发货)。然后剩下的 500 个将需要经过一组不同的状态才能到达已发货。我正在寻找一种管理单个订单的方法,其中许多商品可以划分为多个状态
-
好的,我明白了。它通常的工作方式,也许这就是你的数量分解试图做的就是延期交货。在您的订单项目的每一行,您有 2 个数量 - QuantityOrdered、QuantityShipped。当客户下订单 1000 时,它会转到 QuantityOrdered,根据库存的可用性,您将您拥有的东西放入 QuantityShipped,然后如果您需要创建延期交货,则启动与订单相关联的订单。这些缺货订单会一直待在那里,直到新库存到货,然后您根据缺货订单发起新订单。也有助于了解历史。
-
@Chuma 好的,我们在正确的轨道上,但要求是能够在订单的整个制造过程中跟踪数量。为了扩展您的评论,我需要指出以下内容:QuantityOrdered、QuantityStep1、QuantityStep2 等、QuantityShipped。
-
好的,我知道您要去哪里,并且更好地了解您要如何处理数量分解。我们正在讨论制造的项目流程工作流程与成品订购之间的区别。您的数量分解是正确的设计,实际上是制造车间人员使用的项目工作流程过程表。它只是跟踪项目在工作流中的哪个步骤,并且在订单项目上是只读的。它可能需要一个进入日期和退出日期,以便您了解它在特定状态下停留了多长时间,并可以用来改进指标。
标签: sql sql-server database-design