我有一张包含订单详情的表格。用户可以在首次添加后修改这些详细信息。我的问题是在更新更改之前保存更正确的方法。我的意思不仅仅是主观的思维方式,而是我列出的各种方式的缺点,或者也许是你的建议......
我想创建订单历史表,它将与订单相同,所以一旦我更新订单,旧订单将移至HistoryOrders并更新此订单。
其他方式是每次在Order中使用父字段时发生更新时创建新订单,即。 first update为null作为parentOrderID,而update在parentOrderID列行中更新orderID之前...
我以后需要处理这些数据,所以我需要最灵活的解决方案...也许我想念另一种选择......
CREATE TABLE [dbo].[Orders](
[orderID] [int] IDENTITY(1,1) NOT NULL,
[userID] [int] NOT NULL,
[paymentMethodID] [tinyint] NOT NULL,
[orderAmount] [smallint] NOT NULL,
[orderStatusID] [tinyint] NOT NULL,
[date] [smalldatetime] NOT NULL,
CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[orderID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Orders] WITH CHECK ADD CONSTRAINT [FK_Orders_Users] FOREIGN KEY([userID])
REFERENCES [dbo].[Users] ([userID])
GO
ALTER TABLE [dbo].[Orders] CHECK CONSTRAINT [FK_Orders_Users]
GO
感谢
答案 0 :(得分:1)
当涉及多个表(父/子)时,这会变得更复杂,但是当使用单个历史表时,我使用的I常规模式是创建两个表,主要的一个:XYZ和历史记录一: XYZ_History。我有一个插入/更新/删除触发器,它将所有版本复制到XYZ_History表中。 XYZ_History表具有XYZ表中的所有列,包括XYZHistoryID int identity PK,XYZHistoryType char(1)“I”nsert,“U”pdate,“D”elete和XYZHistoryDate datetime列,即GETDATE()。如果我需要FK一个值为“当前”XYZ值I FK到XYZ.PK,如果我需要FK一个时间点,我使用XYZ_History.XYZHistoryID。我在XYZ_History上也有一个UPDATE / DELETE触发器,它发出一个你无法改变历史记录的错误。
如果不了解您的桌面结构,很难提供任何具体的建议。
答案 1 :(得分:1)
触发器和历史表是常用的SQL方法(已经回答过)。但是,根据您需要跟踪更改的原因,外部化状态更改可能是一个非常好的主意。 Unshackle you Domain(格雷格杨)对此有一些非常有趣的看法。
总之,如果知道您的更改对您的域/问题很重要,您应该跟踪订单中发生的操作,并通过重新应用所发生的所有更改来构建订单的当前状态。而不是保持像:
使用Item1和Item 3订购A
您存储操作:
这意味着您可以跟踪所有更改(甚至是稍后撤消的更改)。当然,这实际上取决于您对历史数据的使用情况。从来没有video有一些非常棒的想法。