2010-06-01 3 views
2

주문 세부 정보가있는 테이블이 있습니다. 사용자는 처음 추가 한 후에 이러한 세부 정보를 수정할 수 있습니다. 내 질문은 변경 사항을 업데이트하기 전에 저장하는 것이 더 옳은 방법입니다. 그건 그냥 주관적인 사고 방식이 아니라 목록에있는 각 방법의 결점이나 아마도 당신의 제안을 의미합니다 ...HowTo : 상태를 변경하기 전에 DB 행을 save로 업데이트하십시오.

주문과 동일 할 주문 내역 테이블을 만들려고했는데, 이전에 주문을 업데이트하면 HistoryOrders로 이동하면이 주문이 업데이트됩니다.

다른 방법은 Order에 부모 필드를 사용하는 동안 업데이트가있을 때마다 새 Order를 만드는 것입니다. 첫 번째 Order는 parentOrderID 열로 null을 갖습니다. 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

어떤 SQL Server 버전을 사용하고 있습니까? –

+0

SQL-SERVER 2005 – eugeneK

답변

1

당신이 (상위/하위)과 관련된 여러 테이블이있을 때이 더 복잡 얻을 수 있지만, 하나의 기록 테이블로 작업 할 때, 나는이 사용하는 I 일반적인 패턴은 두 개의 테이블을 생성, 주요 하나 : XYZ와 역사 하나 : XYZ_History. 모든 버전을 XYZ_History 테이블에 복사하는 단일 삽입/업데이트/삭제 트리거가 있습니다. XYZ_History 테이블에는 XYZHistoryID int ID PK, XYZHistoryType char (1) "I"nsert, "U"pdate, "D"elete 및 GETDATE() 인 XYZHistoryDate datetime 열을 포함하여 XYZ 테이블의 모든 열이 있습니다. 내가 "현재"XYZ 값인 FK를 XYZ.PK로 FK 할 필요가있는 경우, 시점을 FK해야한다면 XYZ_History.XYZHistoryID를 사용합니다. 또한 XYZ_History에서 UPDATE/DELETE 트리거를 사용하여 히스토리를 변경할 수 없다는 오류를 발생시킵니다.

자세한 테이블 구조를 알지 못하면 특별한 조언을 제공하기가 어렵습니다.

+0

구조체를 추가했습니다. – eugeneK

+0

Orders2Items many-to-many 관계 테이블을 가지고 있기 때문에이 방법에 약간의 문제가 있습니다. 사용자가 주문에서 일부 항목을 제거하면 어떻게됩니까? – eugeneK

+0

주문 테이블 구조 만 나열 –

1

트리거 및 히스토리 테이블은 일반적인 SQL 접근 방식 (이미 답변 됨)입니다. 그러나 변경 사항을 추적해야하는 이유에 따라 상태 변경을 외부화하는 것이 좋습니다. Unshackle you Domain (그렉 영 (Greg Young))에는 이것에 대한 흥미로운 사실이 있습니다.

요약하면 도메인/문제에 대한 변경 사항을 아는 것이 중요 할 경우 주문에 발생한 동작을 추적하고 발생한 모든 변경 사항을 다시 적용하여 주문의 현재 상태를 작성해야합니다. 대신 같은 유지의 :

  1. 항목 1
  2. 이 항목이
  3. 을 추가하기 위해 작성 : 항목 1에

    주문 A와 항목을

    3 당신은 작업을 저장 항목 추가 3

  4. 항목 2 제거

이것은 모든 변경 사항을 추적 할 수 있음을 의미합니다 (나중에 취소 한 경우에도 해당). 물론 이것은 기록 데이터에 대한 사용법에 따라 다릅니다. video에는 몇 가지 훌륭한 아이디어가 있습니다.

+0

이것은 "트랜잭션 로그"명령을 먼저 얻은 다음 트랜잭션 로그의 명령을 기반으로 올바른보기를 생성하는 데 필요합니다 ... 너무 무겁지 않습니까? – eugeneK

+0

트랜잭션 체인이 매우 긴 경우 무거울 수 있습니다. 비디오에는 롤링 스냅 샷에 대한 아이디어가 있습니다. 그것은 주어진 시점까지 상태를 볼 수있게 해주고 그 시점부터 적용을 시작합니다. 나는 디자인이 마음에 들지만, 당신이 특정한 경우에 도움이 될지 알아봐야합니다. – Thomas

관련 문제