변경 기록을 유지하기 위해 데이터베이스와 테이블을 디자인하는 가장 좋은 방법은 무엇입니까?


16

이전 변경 사항을 추적하려면 프로젝트에서 히스토리 기능을 설정해야합니다.

지금 두 개의 테이블이 있다고 가정 해 봅시다.

NOTES TABLE (id, userid, submissionid, message)

SUBMISSIONS TABLE (id, name, userid, filepath)

예 : 메모에 행이 있고 사용자가 메시지를 변경하려고합니다. 변경 전과 변경 후의 상태를 추적하고 싶습니다.

이러한 각 테이블에 항목을 "오래 한"경우 열을 설정하는 가장 좋은 방법은 무엇입니까? 활성화 된 경우 0 또는 삭제 / 보이지 않는 경우 1

또한 이전 상태, 새 상태,이 ID와 관련된 AUDIT TRAIL테이블을 보유 하는 기록 ( ) 테이블 을 만들고 싶습니다 .idid


답변:


5

보시기 바랍니다

http://www.codeproject.com/Articles/105768/Audit-Trail-Tracing-Data-Changes-in-Database

데이터베이스 디자인에서 감사 추적을 작성하는 방법에 대해 잘 읽어보십시오. 데이터베이스를 구현하려면 감사 추적이 필요합니다. 항상 시스템 내에서 데이터베이스 사용자의 조치를 볼 수 있어야합니다.

표준 PTA (point in time) 열을 모든 PTA 관심 테이블에 추가하여 PTA (Point in Time) 시스템에서 변경된 행을 추적 할 수 있습니다.

나는 다음을 제안한다.

DateCreated – the actual date on which the given row was inserted.
DateEffective – the date on which the given row became effective.
DateEnd – the date on which the given row ceased to be effective.
DateReplaced – the date on which the given row was replaced by another row.
OperatorCode – the unique identifier of the person (or system) that created the row.

OLTP 애플리케이션에 '솔루션 No. 2 : 전용 데이터 추적 테이블'을 적용하는 가장 좋은 방법은 무엇입니까?
— AA.SC

내가 일하는 회사는 현재 여러 감사 스키마를 위해 여러 스키마를 사용합니다. 감사 테이블은 솔루션 # 2를 사용할 때 실제로 매우 단순한 디자인입니다 (이것은 직장에서 사용하는 것과 정확히 같습니다). 다른 작업 (인벤토리 테이블 업데이트, 고객 정보 업데이트 또는 삭제, 고객에게 제공 한 크레딧 등)을 분류하고 사용자가 수행 할 수있는 일반적인 작업을 기반으로 감사 테이블을 작성하십시오. 그렇지 않으면 솔루션 2를 DB에 적용하는 것과 관련하여 귀하의 질문에 대답합니까? 감사!
— 헥터

실제로 감사 테이블을 사용하여 첫 번째 접근 방식으로 데이터를 이미 감사하지만 감사 데이터가 점점 커지고 있으므로 변경된 열에 대해 데이터를 캡처하여 접근 방식을 변환하려고합니다. 내 질문은 어떻게이 접근법을 달성 할 수 있습니까? 테이블의 어떤 열이 변경되었는지 추적하는 가장 좋은 방법은 무엇입니까? .. 테이블에 20 개가 넘는 열이 있으면 그 중 하나에 DataType Text가 있습니다.
— AA.SC

10

데이터에서 버전 관리 기능을 설계 할 때 몇 가지 최소한의 요구 사항이 있습니다.

  • 각 버전의 데이터는 독립적이며 다른 버전과 독립적이어야합니다. 이것은 현재 버전과 "기록"을 나타내는 플래그 또는 기타 표시기가 없음을 의미합니다. 또한 엔티티를 업데이트한다는 것은 이전 버전을 업데이트 할 필요없이 새 버전 만 삽입하는 것을 의미합니다.
  • 내가 행 스패닝 종속성이라고 부르는 것을 피하십시오. 그것이 행의 한 필드 (End_Date)가 다른 행의 다른 필드 (Start_Date)와 동기화되어 있어야하는 곳입니다. 이로 인해 데이터 작업이 더욱 어려워지고 예외적 인 원인이됩니다.
  • 현재 버전과 모든 이전 버전은 동일한 테이블에 있어야합니다. 따라서 동일한 쿼리를 사용하여 특정 날짜를 기준으로 과거 데이터를보고 현재 데이터를 볼 수 있습니다.
  • 버전이 지정된 데이터의 외래 키는 일반 (버전이없는) 데이터와 동일하게 작동해야합니다.
  • 새로운 개발자를위한 학습 곡선이 최소화되도록 디자인은 매우 단순하거나 보편적으로 이해되어야합니다.

다음 은 기술 박람회에서 몇 차례 발표 한 프레젠테이션 슬라이드입니다. 위의 모든 작업을 수행하는 방법을 설명합니다. 더 자세한 내용은 다음 과 같습니다 . 문서에 대해 사과해야합니다. 문서가 진행 중이며 모든 섹션이 완료되지 않았습니다. 그러나 간단한 버전 관리에서 전체 이중 시간 액세스에 이르기까지 모든 것을 구현하는 데 필요한 모든 정보를 제공해야합니다.


1
아주 좋은 포인트! 그러나 This means no flag or other indicator showing which is the current version and which are "history."플래그 또는 표시 기가없는 경우 현재 버전과 기록 버전을 어떻게 구별합니까? 특히 세 번째 요점을 바탕으로 동일한 테이블에 있어야한다고 제안합니다.
— GMsoF

프레젠테이션은 테이블에서 현재 및 / 또는 과거 데이터를 읽는 쿼리를 포함하여 예제 디자인을 보여줍니다. 더 깊이 들여다보기에 흥미로워 보인다면 문서에 훨씬 더 자세한 내용이 들어 있습니다.
— TommCatt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.