我想创建一个简单的库存系统:
我不确定我应该拥有多少个表以及包含哪些。我尝试了以下方法,但它似乎不起作用:
销售(序列号,名称,单元,数量,金额,SALE_DATE) 购买(序列号,姓名,单位,数量,金额,购买日期,EXPIRY_DATE) 用户(Work_Id,名字,姓氏,用户名,密码,Confirm_Password)
我正在使用visual studio 2010和MySQL
答案 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仍然是一个很好的资源。
我不确定我应该拥有多少个表以及要包含哪些表。
这大部分取决于您自己项目的要求。也许您需要坐下来仔细考虑您想要记录的级别信息以及如何使用它?
然而,有几点意见:
而不是在每个表中包含“Name”和“Unit”,将Serial_Number
外键设置到包含该信息的单独Products
表中。
Password
表中不包含Confirm_Password
和Users
:如果密码已经确认,您只想记录密码(在此,您应该只记录盐渍哈希而不是明文密码本身 - 请参阅上面链接的身份验证指南。
我尝试过以下操作,但似乎无效:
作为@Olaf Dietsche commented,如果您解释什么“似乎不起作用,通常会有所帮助。就目前而言,我们不知道您是否编写了10,000行代码并且正在努力处理一个小块,或者你是否只创建了这些表,并期望整个库存管理系统神奇地出现!