【问题标题】:Best structure for inventory database库存数据库的最佳结构
【发布时间】:2019-07-16 02:58:18
【问题描述】:

我想为我的库存创建一个小型数据库,但在选择结构时遇到了一些问题。库存将在每天结束时更新。

我面临的问题如下。

我的产品有一张桌子,有一个

id, name, price, quantity.

现在我有另一张桌子用于销售,但这是我的问题。我需要什么样的字段。在一天结束时,我想存储这样的记录:

20       product_x       $ 5,00         $ 100,-
20       product_y       $ 5,00         $ 100,-
20       product_z       $ 5,00         $ 100,-
20       product_a       $ 5,00         $ 100,-
-------------------------------------------------
                                        $ 400,-

那么我如何在销售记录中对此进行建模。我是否只是创建一个以产品 ID 的逗号分隔的连接记录。

或者是否有另一种方法以正确的方式进行建模。

【问题讨论】:

  • 切勿在字段中使用串联列表,这表明您需要相关表。
  • 产品表中的数量是多少?库存水平?

标签: database structure


【解决方案1】:

这是一个支持多方面的模型,

  1. 支持站点、位置和仓库等。
  2. 支持分类和分组
  3. 支持通用产品(例如“台钟”和特定产品“Citizen C123 Multi Alarm Clock”)
  4. 还支持品牌变体(由不同制造商提供)
  5. 具有 CSM(颜色/尺寸/型号支持)例如。 Bata Sandles(颜色 45 英寸蓝色)
  6. 带有连续剧的产品实例(例如电视、冰箱等)
  7. 带有序列号的批次控制/批次控制。
  8. 包装尺寸/UOM 和 UOM 转换
  9. 制造商和品牌以及供应商
  10. 还包括示例交易表(采购订单)
  11. 还有许多其他交易类型,例如问题、转让、调整等。

希望这会有所帮助。如果您需要关于每张桌子的更多信息,请告诉我。

干杯...!!!

瓦吉拉·维拉辛格。

网站

  • 身份证
  • site_code
  • 站点名称

仓库

  • 身份证
  • site_id
  • 仓库代码
  • 仓库名称

项目类别

  • 身份证
  • category_code
  • 类别名称

项目组

  • 身份证
  • group_code
  • 组名

通用产品

  • 身份证
  • 通用名称

产品

  • 身份证
  • product_code
  • category_id
  • group_id
  • brand_id
  • generic_id
  • model_id/part_id
  • 产品名称
  • product_description
  • product_price(当前价格)
  • has_instances(y/n)
  • has_lots (y/n)
  • has_attributes
  • default_uom
  • pack_size
  • 平均成本
  • single_unit_product_code(用于包装)
  • dimension_group(指向维度)
  • lot_information
  • warranty_terms(一般而非具体)
  • is_active
  • 已删除

产品属性类型(颜色/尺寸等)

  • 身份证
  • 属性名称

product_attribute

  • 身份证
  • product_id
  • attribute_id

产品属性值(本产品->红色)

  • 身份证
  • product_attribute_id
  • 价值

product_instance

  • 身份证
  • product_id
  • instance_name(由制造商提供)
  • 序列号
  • brand_id(是这个品牌)
  • stock_id(股票记录指向qih、位置等)
  • lot_information (lot_id)
  • warranty_terms
  • 产品属性值 ID(如果适用)

产品批次

  • 身份证
  • lot_code/batch_code
  • 生产日期
  • date_expiry
  • 产品属性值 ID(如果适用)

品牌

  • 身份证
  • manufacturer_id
  • 品牌代码
  • 品牌名称

品牌制造商

  • 身份证
  • 制造商名称

库存

  • 身份证
  • product_id
  • warehouse_id、zone_id、level_id、rack_id 等
  • 在手数量
  • 产品属性值 ID(如果适用)[我们有 4 种红色商品等]

产品价格记录

  • product_id
  • 从_日期
  • product_price

采购订单标题

  • 身份证
  • supplier_id
  • 购买日期
  • total_amount

采购订单行

  • 身份证
  • po_id
  • product_id
  • 单价
  • 数量

供应商

  • 身份证
  • 供应商代码
  • 供应商名称
  • supplier_type

product_uom

  • 身份证
  • uom_name

product_uom_conversion

  • 身份证
  • from_uom_id
  • to_uom_id
  • conversion_rule

【讨论】:

  • 存储并不断更新手头数量或在运行时通过事务表计算它是个好主意吗?在这里,当事务表变大时,我们可能需要一些规定。你能建议在这种情况下应该做什么吗?
  • 将 QIH 保留在主表中总是好的。因为我们查询的时候不应该使用多个表,特别是事务表涉及太多。另请记住,更新每笔交易的 QIH(手头数量)很容易,因为它们的执行速度相对较慢或间隔较长,不会影响这样做的性能。
  • @Wajira Weerasinghe,您是否可以为每个表添加示例数据,以便没有领域知识的人(如我)了解每个表的用法?
  • @Wajira Weerasinghe 如果产品是由原材料制造和制造的,您将如何添加到您的设计中,例如可以由原材料 A 制成 10 种不同的产品,但每种产品的用量不同。因此,如果您销售 10 种产品中的一种产品,它会动态影响您可以制造的所有其他产品的库存水平。
  • 写得真好@WajiraWeerasinghe!如果您也能写下与销售相关的模式,那就完美了。竖起大拇指! :-)
【解决方案2】:

我有一个表格,每天每件商品都有一行 - 存储日期、商品 ID、销售数量和销售价格(即使它也在产品表中也可以存储 - 如果情况发生变化,您希望保留实际出售的价值)。您可以在查询中计算每个项目天的总数和每天的总数。

表格:

create table product (
  id integer primary key,
  name varchar(100) not null,
  price decimal(6,2) not null,
  inventory integer not null
);

create table sale (
  saledate date not null,
  product_id integer not null references product,
  quantity integer not null,
  price decimal(6,2) not null,
  primary key (saledate, product_id)
);

一天的报告:

select s.product_id, p.name, s.quantity, s.price, (s.quantity * s.price) as total
from product p, sale s
where p.id = s.product_id
and s.saledate = date '2010-12-5';

全天报告:

select saledate, sum(quantity * price) as total
from sale
group by saledate
order by saledate;

一份不错的总报告,带有摘要行:

select *
from (
    (select s.saledate, s.product_id, p.name, s.quantity, s.price, (s.quantity * s.price) as total
    from product p, sale s
    where p.id = s.product_id)
  union
    (select saledate, NULL, 'TOTAL', sum(quantity), NULL, sum(quantity * price) as total
    from sale group by saledate)
) as summedsales
order by saledate, product_id;

【讨论】:

    【解决方案3】:

    尝试将您的销售建模为交易 - 使用“标题”,即销售对象、销售时间、发票编号(如果适用)等和“订单项”,即 20 * product_x @ $5 = $100。最安全的方法是避免依赖产品表中的价格等 - 因为这些可能会随着时间的推移而变化,而是将大部分产品信息(如果不是全部)复制到您的订单项中 - 所以即使价格、项目描述等. 更改,交易信息保持与交易发生时相同。

    【讨论】:

      【解决方案4】:

      库存建模可能会变得相当复杂。首先,您需要了解您需要能够根据您支付的费用来判断现有库存的价值。这意味着您不能依赖更新为当前价格的产品表。虽然您可能需要这样的表格来帮助您确定出售它的目的,但出于税收原因,您需要知道您为仓库中的每件物品支付的实际金额。

      因此,首先您需要产品表(您可能需要确保其中有一个更新的日期列,以便了解您的价格是否过时)。

      然后您需要一个表格来存储每个零件的实际仓库位置和购买价格。如果物品足够大,您需要一种方法来单独标记每个物品,以便您知道取出了什么。通常人们为此使用条形码。需要更新此表以记录当您出售该零件时该零件已不存在。我更喜欢让记录处于非活动状态,并将我的销售数据链接到该记录,这样我就可以确切地知道我支付的费用以及每个零件的销售价格。

      Sales 至少应该有两张桌子。一个是关于销售的一般信息、客户名称(大部分时间还应该有一个客户表来获取这些数据)、日期、发货地点等。

      然后是一个销售明细表,其中包含订单中每个行项目的记录。包括您需要的关于零件、颜色、尺寸、数量、价格的所有数据。这不是反规范化,这是存储历史数据。您不想做的一件事是依赖产品表中的价格来获取除了该表的初始条目之外的任何内容。您不想做销售报告并因为产品价格在前一天发生变化而出现错误的数字。

      在未咨询会计师或税务专家的情况下,请勿设计库存数据库。您还应该阅读内部控制。很容易从一个没有在数据库中完成内部控制工作的公司偷窃而未被发现。

      【讨论】:

      • 不是将所有详细信息复制到每个销售行,如何对产品行进行版本控制?您可以创建一个新行(因此行的主键是产品 ID 和版本号),而不是使用新的详细信息更新产品(或 SKU),然后销售可以简单地参考销售的版本。这可以让您获得历史准确性,而无需重复数据。它也应该简化分析。
      • 个人版本控制对于这类事情来说更难管理,而且随着时间的推移更可能不正确。在销售时存储详细信息更安全。而且你可能不会以表格中的价格出售产品(想想折扣、销售活动等)
      【解决方案5】:

      我认为您需要一个表格,其中包含显示每个客户的交易属性的字段 或者 包含字段的表格 - 日期,产品(外国),数量 - 这样您就不会遇到新产品的问题

      【讨论】:

        【解决方案6】:

        尝试多个带有链接的表

        table_products
        id
        name
        
        table_product_sales
        id
        product_id
        quantity
        price_per
        transaction_time AS DATETIME
        
        SELECT table_product_sales.*, table_product.name 
        FROM table_product
        JOIN table_product_sales
        ON table_product_sales.product_id = table_product.id
        GROUP BY DATE(transaction_time)
        

        还没有尝试过,但类似的东西会起作用吗?这使您可以将每笔交易分开,这样您就可以查询每次销售的平均销量、每个日期的总销量、每天的总销量等。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-17
          • 2023-04-08
          • 1970-01-01
          • 1970-01-01
          • 2020-01-13
          • 2021-12-25
          相关资源
          最近更新 更多