我对我在软件开发课程中正在做的项目的数据库设计有疑问。
我有一个表来存储“采购订单”,每个采购订单与“状态”表具有多对一关系。因此,每个采购订单可以具有一个状态,例如:“未结请求”,“收到的货物”,“收到的发票”等。
嗯,一切正常。但是,我希望将更改历史记录存储到状态字段中。因此,何时将其更改为“已收到货物”,何时将其更改为“已收到发票”或任何其他状态。
我想我需要创建一个新表来存储这些表?如果是这样,我不确定如何实现此目标,以及如何在Web应用程序中构建所需的逻辑。我正在从头开始学习所有内容,所以不确定该逻辑是否应该在我的laravel项目(MVC)的控制器中,或者数据库是否能够处理该逻辑-例如,当主数据库能够级联删除记录时,记录被删除。
我的主要问题是我不知道这种类型的问题是否有名称,所以我也在努力地用Google搜索它。
非常感谢您的帮助。
答案 0 :(得分:2)
历史记录日志有多种方法,或者您可以说审核日志记录。
1.Triggers
2.CDC(IN SQL server only)
3. By Your own code (i.e object cloning)
4. Inside your DML procedures
答案 1 :(得分:1)
我的主要问题是我不知道这种类型的问题是否有名称,所以我也在努力地用Google搜索它。
您要查找的是“审核”或“审核日志”或“版本”。
我喜欢paper_trail的工作方式。您有一个表来存储对任何表的更改。审核表将表,主键,操作(插入,更新,删除)和行的快照存储为JSON。
您可以将其实现为database triggers或ORM中的回调。
答案 2 :(得分:1)
我认为您正在尝试根据订单的“状态”创建订单的审核/历史记录跟踪记录。
仅从数据库角度来看,这是实现所需内容的一种方法:
创建一个新表,例如OrderStatusLog->具有列: 一种。 OrderID(“订单”表中的主键)-要知道与哪个订单相关 b。 Prev_OrderStatusID-这将是旧/原始订单状态 C。 Current_OrderStatsID-这将具有最新的OrderStatusID
在“订单”表上创建触发器,例如:
CREATE TRIGGER [dbo].[trgOrderStatusLog]
ON [dbo].[Orders]
AFTER UPDATE
-- If you need to log when initially the Order was placed, change the
above line to:
-- AFTER INSERT,UPDATE
AS
INSERT INTO OrderStatusLog(OrderID, Prev_OrderStatusID, Current_OrderStatsID)
SELECT
I.ORDERID,
D.OrderStatusID, -- This is your Order Status before update
I.OrderStatusID -- This is your Order Status before update
FROM INSERTED I
INNER JOIN DELETED D ON I.ORDERID = D.ORDERID
一个好主意是添加Timestamp和User更新记录(即使对于学校项目也是如此)。
从这一点开始,您需要做的只是一个更新调用/过程,它将更新Orders表。并且,将在OrderStatusLog
表中创建每个更新的日志/记录。
这是完成当前任务的非常基本和直接的方法。另外,此语法基于SQL Server。
希望有帮助!