具有多个单元的产品的数据库设计

时间:2017-01-20 16:45:32

标签: sql sql-server sql-server-2008

我正在使用Sql server作为后端为零售业务设计数据库。有些产品可以在多个单元中出售,例如,铅笔可以在ea和打印出售,纸张可以以片材,ream和canton出售。基本上,每种产品都可以在多个单元中出售。

应用程序需要支持

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

以下是我的初步设计

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

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

1 个答案:

答案 0 :(得分:5)

我有一些建议:

  1. 看起来您可以删除UnitConversion表并将Multiplier值存储在Unit记录中(因此您将针对每个/ Pieces存储1,对Box存储24)。那么转换只是'From'单位的数量除以'To'单位的数量。

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

  3. 在您的清单和发票表中,可能不需要ProductId列,因为您可以通过加入Units表来获得此信息。

  4. 为了支持FIFO或LIFO,你需要存储更多关于你股票的具体信息,所以有一些方法可以知道它的预订日期,剩余数量,也许还有一些识别方法该特定项目(或项目组)。

  5. 希望这有帮助!

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

    Id | UnitId | [identifier] | CurrentQuantity | DateAdded
    1  | 1      | ABC123       | 20              | 2017-01-10
    2  | 1      | ABC124       | 96              | 2017-01-12
    

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

    要在某人想要购买24支铅笔的情况下实施FIFO,您需要从标有“ABC123”和4个标记为“ABC124”的项目中选择20个。