【问题标题】:Database Design: Order Items with quantities spanning multiple statuses数据库设计:订购数量跨越多个状态的项目
【发布时间】: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


【解决方案1】:

好吧,我不能只是发表评论来要求澄清。

但我会让每个 OrderItem 成为具有自己状态(OrderItem 中的状态)的订单中的不同项目。所以如果事实上你有 4 套相同的物品,每套都会有自己的状态。

如果您想要每个 OrderItemId 的总数,您可以随时分组

【讨论】:

  • 我已添加示例以帮助澄清
  • 这就是我的意思。汉堡是您的 orderitem 表中的 2 个不同的项目,具有各自不同的属性。只有在一切都将永远在一起并且始终处于相同状态的订单上,您才能将它们放在一起。如果需要,您仍然可以在客户收据上将汉堡组合在一个项目上。
  • 我关心的是可扩展性。潜在数量很容易达到每年 300 万条记录(每年 3000 个订单,总商品数量平均每个 1000 条)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多