2

我想创建一个简单的库存系统来:

  • 保留库存记录
  • 当产品缺货时提醒用户
  • 跟踪销售和购买
  • 当产品即将到期时提醒用户(可能提前 7 天)
  • admin 创建用户帐户(所有用户必须登录)。

我不确定我应该有多少张桌子以及要包括什么。我尝试了以下方法,但似乎不起作用:

销售(序列号、名称、单位、数量、金额、销售日期) 购买(序列号、名称、单位、数量、金额、购买日期、到期日期) 用户(工作 ID、名字、姓氏、用户名、密码、确认密码)

我正在使用 Visual Studio 2010 和 MySQL

4

2 回答 2

4

我最近编写了一个库存系统,其中一些字段被证明非常有用。我确保为所有行和一个“IsActive”位包含一个“创建”日期时间,当您选择删除某些内容时将其设置为 false(因此每次删除都是软删除)并从那里确保我有一个很好但不过分的规范化模式来描述我的数据。

如果您想要一个简单的库存并且认为它可以被 2 或 3 张桌子覆盖,那么您最终可能会得到 20 到 30 个,甚至可能更多。例如,让您的项目是一个表,itemtypes 是另一个,itemcategories 是另一个。确保有一个单独的项目、购买、销售等历史记录表。

从最广泛的类别开始。用您可能需要描述的所有表格充实它们,例如,您的库存。如果您有盒子、钉子、锤子,您可能需要一个列出“容器”、“硬件”、“工具”的类别表。

对于您添加到库存中的每个锤子,它应该是您的项目表中的一个新行,它引用您的项目类型“锤子”。然后随着每件商品的售出,您可以更改每件商品的状态。如果您想知道您有多少个锤子,您可以在项目表中查询所有具有可用状态的“锤子”类型的项目。如果锤子卖了,你把它换成卖的。如果返回的锤子状况良好,则将该特定项目改回可用。

不要删除行,只需将它们的“IsActive”位设置为 false。这样,如果它链接到“已删除”项目,稍后报告您的数据仍然可以正常工作,并且在一般使用期间,您可以只查询 IsActive = 1 的项目。

希望这会有所帮助,这是我的技术,尽管我相信还有很多其他的。欢迎评论,学习总是好的。

于 2012-10-31T08:39:57.480 回答
3
  • 保留库存记录

    使用您当前的数据结构,这将不是一件容易的事:您必须查看整个历史记录并考虑哪些购买已用于完成每笔销售(并假设该确定实际上是正确的)。维护一个可用库存的附加表会容易得多:

    available_stock ( Serial_Number, Quantity, Expiry_Date )
    

    然后,您可以使用 MySQL 的事件调度程序自动删除过期库存:

    CREATE EVENT remove_expired_stock
    ON SCHEDULE EVERY DAY STARTS CURRENT_DATE
    DO DELETE FROM available_stock WHERE Expiry_Date < CURRENT_DATE
    

    确保在每个表上使用 InnoDB 存储引擎,以便您可以将数据库操作包装在事务中以确保原子性:

    START TRANSACTION;
    
    SELECT SUM(Quantity) FROM available_stock WHERE Serial_Number = ? FOR UPDATE;
    
    -- only proceed if quantity is sufficient for a sale
    
    SET @q := ?;  -- quantity required
    
    UPDATE   available_stock
    SET      Quantity = GREATEST(@d, 0)
    WHERE    Serial_Number = ?
         AND (@d := Quantity - @q) IS NOT NULL
         AND (@q := -LEAST(@d, 0)) IS NOT NULL
    ORDER BY Expiry_Date;
    
    DELETE FROM available_stock WHERE Quantity = 0;
    
    INSERT INTO Sales ...
    
    COMMIT;
    

    您甚至可以在表格上定义一个触发器Purchases以自动将新库存插入available_stock表格中:

    CREATE TRIGGER new_stock AFTER INSERT ON Purchases FOR EACH ROW
      INSERT INTO available_stock
        ( Serial_Number, Quantity, Expiry_Date )
      VALUES
        ( NEW.Serial_Number, NEW.Quantity, NEW.Expiry_Date );
    
  • 当产品缺货时提醒用户

    尚不完全清楚您所说的“警报”是什么意思,但您可能希望定期从应用程序代码中运行某种检查,然后在需要时发送通知(通过任何方式:电子邮件、SMS 等)。

  • 跟踪销售和购买

    您现有的结构使您能够做到这一点。

  • 当产品即将到期时提醒用户(可能提前 7 天)

    如上。

  • admin 创建用户帐户(所有用户必须登录)。

    这将在您的应用程序中强制执行,尽管您可能会像您所做的那样将用户存储在数据库中。请注意,滚动自己的身份验证系统有许多常见的陷阱:虽然它可能并不都与您的项目直接相关,但基于表单的网站身份验证的权威指南仍然是一个很好的资源。

  • 我不确定我应该有多少张桌子以及要包括什么。

    这在很大程度上取决于您自己项目的要求。或许你需要坐下来好好想想你想记录什么级别的信息以及如何使用它?

    但是,有几点观察:

    1. 而不是在每个表中包含“名称”和“单位”,而是将外键放入包含该信息Serial_Number的单独表中。Products

    2. 不要在表中同时包含Password和:您只想记录已经确认的密码(此时,您应该只记录加盐哈希而不是明文密码本身 - 请参阅上面链接的身份验证指南) .Confirm_PasswordUsers

  • 我尝试了以下方法,但似乎不起作用:

    正如@Olaf Dietsche 评论的那样,如果您解释什么“似乎不起作用”通常会很有帮助。就目前而言,我们不知道您是否已经编写了 10,000 行代码并且正在为一小部分而苦苦挣扎,或者您是否“我们只创建了这些表,并期待整个库存管理系统神奇地出现!

于 2012-10-31T09:24:31.470 回答