要包含在简单库存数据库中的内容

时间:2012-10-31 08:22:09

标签: mysql

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

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

我不确定我应该拥有多少个表以及包含哪些。我尝试了以下方法,但它似乎不起作用:

  

销售(序列号,名称,单元,数量,金额,SALE_DATE)   购买(序列号,姓名,单位,数量,金额,购买日期,EXPIRY_DATE)   用户(Work_Id,名字,姓氏,用户名,密码,Confirm_Password)

我正在使用visual studio 2010和MySQL

2 个答案:

答案 0 :(得分:4)

我最近编写了一个库存系统,并证明了一些领域非常有用。我确保为所有行包含一个'created'日期时间和一个'IsActive'位,当你选择删除某些内容时设置为false(所以每次删除都是一个软删除)并从那里确保我有一个很好但不过度的规范化模式来描述我的数据。

如果你想要一个简单的库存,并且认为它可以用2或3个表格覆盖,你可能最终会得到20到30,可能会更多。例如,让您的项目成为一个表格,项目类型为另一个,而itemcategories则是另一个。请务必为项目,购买,销售等设置单独的历史记录表。

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

对于您添加到库存中的每个锤子,它应该是您的项目表中的新行,它引用您的项目类型“Hammer”。然后在销售时,您可以更改每个项目的状态。如果你想知道你有多少锤子,你可以在物品表中查询所有具有状态的“锤子”类型的物品。如果出售锤子,则将其更改为已售出。如果锤子返回状况良好,则将该特定项目更改回“可用”。

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

希望这有帮助,这是我的技术,虽然我确信还有很多其他的。欢迎评论,学习总是好的。

答案 1 :(得分:3)

  •   

    保留库存记录

    根据您当前的数据结构,这不是一件容易的事情:人们必须查看整个历史记录,并考虑使用哪种购买来完成每次销售(并假设确定实际上是正确的)。维护额外的可用库存表会容易得多:

    available_stock ( Serial_Number, Quantity, Expiry_Date )
    

    然后您可以使用MySQL的event scheduler自动删除过期的股票:

    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表格中定义trigger,以便自动将新库存插入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 );
    
  •   

    产品缺货时提醒用户

    “警报”的含义并不完全清楚,但您可能希望定期从应用程序代码中进行某种检查,然后根据需要发送通知(通过任何方式:电子邮件,短信等)。

  •   

    跟踪销售和购买

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

  •   

    当产品几乎达到其到期日期(可能是7天前)时提醒用户

    如上所述。

  •   

    管理员创建用户帐户(所有用户都必须登录)。

    这将在您的应用程序中强制执行,尽管可能会像您一样将用户存储在数据库中。请注意,滚动自己的身份验证系统有许多常见的陷阱:虽然它可能并非与您的项目直接相关,但The Definitive Guide to Forms based Website Authentication仍然是一个很好的资源。

  •   

    我不确定我应该拥有多少个表以及要包含哪些表。

    这大部分取决于您自己项目的要求。也许您需要坐下来仔细考虑您想要记录的级别信息以及如何使用它?

    然而,有几点意见:

    1. 而不是在每个表中包含“Name”和“Unit”,将Serial_Number外键设置到包含该信息的单独Products表中。

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

  •   

    我尝试过以下操作,但似乎无效:

    作为@Olaf Dietsche commented,如果您解释什么“似乎不起作用,通常会有所帮助。就目前而言,我们不知道您是否编写了10,000行代码并且正在努力处理一个小块,或者你是否只创建了这些表,并期望整个库存管理系统神奇地出现!