2011-01-27 9 views
0

나는 이 아니며 감사 또는 기록 추적을 원합니다.SQL 2005/2008 데이터베이스 트랙 필드 변경

외부 소스에서 데이터를 가져 오는 응용 프로그램이 있습니다. 우리는 우리 자신의 DB에서 외부 테이블을 미러링합니다. 우리는 사용자가 DB의 데이터를 업데이트 할 수 있도록 허용합니다. 다음 번에 시스템이 외부 데이터와 동기화되면 우리는 로컬로 변경하지 않은 필드 만 덮어 씁니다.

내 머리 위로 떨어져 나는 각 개체에 대해이

1) 스토어 2 개 행을 할 수있는 2 가지 방법으로 생각할 수 있습니다. 첫 번째 1은 외부 버전이고 두 번째 행은 외부 버전에 연결되지만 해당 필드가 변경된 경우에만 필드에 데이터가 있습니다. 예 :

id  |  parentId | field1  | field2 
1  |  null  |  foo  | bar 
2  |  1  |  new foo | null 

로컬 사용자가 field1을 변경했을 때의 데이터 모양을 보여줍니다. 변경 사항이없는 경우 첫 번째 행만 나타납니다.

2) 테이블의 열 수를 두 배로 늘립니다. 예컨대 name_external name_internal

더 나은 분리 및 쿼리 할과 두 개체 사이의 코드 비교에서 할 쉽게 제공 할 것처럼 보인다 내가 옵션 1 더 좋아한다. 유일한 단점은 행 수가 많아 질 것이지만 DB는 상당히 작을 것입니다.

사용할 수있는 다른 패턴이 있습니까? 아니면 이유는 내가 옵션 1. 나는 아래에 제공된 두 개의 테이블 답을 갈 것입니다 .NET 4 개 WCF 서비스


솔루션

을 사용하는 것입니다

로 이동하지 않아야합니다. 단지 이제까지 UI 시스템을 통해 업데이트 할 수있을 것입니다 내 DB를 에서처럼 orginal 한 값

SELECT 
    a.[ID], 
    isnull(b.[firstName], a.[firstName]), 
    isnull(b.[lastName], a.[lastName]), 
    isnull(b.[dob], a.[dob]), 
    isnull(b.active, a.active) 
From tbl1 a 
left join tbl2 b on a.[ID] = b.[ID] 

로컬로 변경 합병 한 필드가있는 행을 반환하는 다음과 같은 SQL을 사용합니다. 그리고 사람들이 빈 문자열을 입력하도록 대신 값으로 NULL을 입력하도록 허용 할 수 있습니다. 사용자가 당신이 옵션을 선택하면 생각할 수있는 두 가지 문제가 있습니다

+0

몇 개의 필드가 필요합니까? 행이 몇 개입니까? 무슨 SQL 버전? – Hawxby

+0

20 개의 테이블, 각 테이블의 2 열에서 20 열 사이. 각 테이블은 100 - 5000 행 사이에 있습니다 – Daveo

답변

1

사용자가 데이터를 업데이트 할 수 있도록 허용 1.

당신이 중 하나를 의미 NULL로 값을 업데이트하면이 날 무슨 일이 문제를 극복 할 수 삽입/업데이트/삭제 명령문을 수행하는 절차를 작성하거나 이중 행 구조를 관리해야하거나 모든 사용자에게 테이블을 올바르게 업데이트하도록 교육해야합니다.

다른 문제는 NULL이 될 수있는 테이블의 모델링 필드입니다. 필드를 나타 내기 위해 NULL을 사용하는 경우 변경되지 않았습니다. 어떻게 NULL로 변경되는 필드를 나타낼 수 있습니까?

두 번째 옵션은 업데이트의 복잡성을 피하고 NULL 값을 저장할 수 있지만 행 크기가 증가하고 서버가 이동해야하는 데이터의 양으로 인해 성능이 저하 될 수 있습니다 그것을 테스트하지 않고서는이 주장이 입증되지 않았지만 나는 그것을 언급 할만한 가치가 있다고 생각했다).

또 다른 제안은 외부 데이터 원본과의 동기화가 수행 된 직후에 데이터의 스냅 샷을 보관하는 다른 스키마에 테이블을 넣는 것입니다.

전체 감사를 원하지 않는다는 것을 알고 있습니다. 이는 특정 시점의 데이터 사본 일 것입니다. 그런 다음 사용자가 이중 행/열의 복잡성없이 원하는대로 데이터를 수정할 수 있도록 허용 할 수 있으며 외부 소스와 다시 동기화 할 때 어떤 필드가 변경되었는지 확인할 수 있습니다.

좋은 기사 : The shortest, fastest, and easiest way to compare two tables in SQL Server: UNION!을 찾아 냈습니다.

+0

우수한 응답, 당신은 매우 유효한 포인트를 만듭니다 – Daveo

+0

나는 2 테이블 옵션으로 갈 것이라고 생각합니다. EF CodeFirst를 사용하여 구현하기가 매우 쉽습니다. 내 질문을 업데이 트했습니다 내가 사용하는 SQL을 표시 – Daveo

0

UpdatedBy 필드를 업데이트하는 업데이트 트리거가 있다고 생각해보십시오. 가져 오기를 완료 한 사용자는 필드를 업데이트하는 다른 프로세스를 사용할 수 없습니다. 따라서 사용자 -1 이외의 값이 마지막으로 업데이트 된 경우 쉽게 알 수 있습니다. 그런 다음 병합 statment를 사용하여 삽입/삭제/업데이트 할 수 있습니다.

+0

어떻게 그 전체 행에 대해 작동 할 수 있지만 그 열 cenario 당 작동 방식을 볼 수 없어 이해할 수 있습니다. – Daveo

관련 문제