多单元产品的数据库设计

Ljt*_*Ljt 1 sql sql-server sql-server-2008

我正在设计一个使用 Sql 服务器作为后端的零售业务数据库。有一些产品是可以多卖的,比如铅笔可以卖一打,纸可以卖单、令、筒。基本上,每种产品都可以以多个单位出售。

App需要支持

  • 可以从多个单位的供应商处接收产品。有时我们可能会订购 1 支铅笔,下次我们会订购 2 盒铅笔。
  • 可以以多个单位销售产品,例如,我们必须能够在同一张账单中销售 1 盒和 2 支铅笔。
  • 应用程序还需要支持先进先出或后进先出

下面是我的初始设计

Table: Products
ProductId | Barcode | Name   | BaseUnitId
1         | XXXX    | Pencil | 1

Table: Units
UnitId | Name
1      | Each / Pieces
2      | Box

Table: UnitConversion
ProductId | BaseUnitId | Multiplier | ToUnitId |
1         | 1          | 24         | 2        | // 24 pencils in a box

Table: Inventories
Id | ProductId | UnitId | Quantity 
1  | 1         | 1          | 48                //In pieces

Table Invoices
Id | ProductId | UnitId | Quantity
1  | 1         | 2      | 1.5                   //Sold/Purchased 1.5 boxes that means 18 pieces
Run Code Online (Sandbox Code Playgroud)

我的设计有什么缺陷吗?有什么我想念的吗?这不可能是一个新问题。有没有人有任何想法(或例子)?

Sam*_*Sam 6

我有几点建议:

  1. 似乎您可以删除 UnitConversion 表并仅针对 Unit 记录存储 Multiplier 值(因此您可以针对每个 / 件存储 1,针对 Box 存储 24)。然后转换就是“From”单位的数量除以“To”单位的数量。

  2. 不同的单位可能有不同的条形码吗?如果是这样,条形码可以存储在单位记录中。

  3. 在您的 Inventories 和 Invoices 表中,ProductId 列可能是不必要的,因为您可以通过加入 Units 表来获得它。

  4. 为了支持先进先出或后进先出,您将需要存储有关您的库存的更多具体信息,因此有一些方法可以知道它的预订日期,剩余数量,也许还有一些方法可以识别该特定项目(或组项)。

希望这可以帮助!

编辑:您的库存表可能如下所示:

Id | UnitId | [identifier] | CurrentQuantity | DateAdded
1  | 1      | ABC123       | 20              | 2017-01-10
2  | 1      | ABC124       | 96              | 2017-01-12
Run Code Online (Sandbox Code Playgroud)

[标识符] 列(名称由您决定!)将存储某种识别实物库存的方式,这可能是用户在收到物品时分配的内容,或者他们的供应商可能已经添加了一些可以使用的内容。

要在某人想要购买 24 支铅笔的场景中实施 FIFO,您知道需要从标有“ABC123”的项目组和标有“ABC124”的项目组中取出 20 支。