操作方法:在更改状态之前使用save更新DB行

时间:2010-06-01 13:26:58

标签: sql sql-server

我有一张包含订单详情的表格。用户可以在首次添加后修改这些详细信息。我的问题是在更新更改之前保存更正确的方法。我的意思不仅仅是主观的思维方式,而是我列出的各种方式的缺点,或者也许是你的建议......

我想创建订单历史表,它将与订单相同,所以一旦我更新订单,旧订单将移至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

感谢

2 个答案:

答案 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

您存储操作:

  1. 创建订单A
  2. 添加第1项
  3. 添加第2项
  4. 添加第3项
  5. 删除第2项
  6. 这意味着您可以跟踪所有更改(甚至是稍后撤消的更改)。当然,这实际上取决于您对历史数据的使用情况。从来没有video有一些非常棒的想法。