새 데이터베이스를 디자인해야 할 때마다 변경 사항에 대한 감사 로그를 유지하기 위해 데이터베이스 스키마를 설정하는 방법에 대해 꽤 많은 시간을 할애합니다.
여기에 대해 이미 몇 가지 질문이 있었지만 모든 시나리오에 대해 최선의 단일 접근법이 있다는 것에 동의하지 않습니다.
또한 각 접근 방식의 장단점을 나열하는 데이터베이스 변경 로그 유지 관리에 대한 이 흥미로운 기사를 우연히 발견했습니다 . 잘 작성되어 있고 흥미로운 정보가 있지만 내 결정을 더 어렵게 만들었습니다.
내 질문은 : 내가 사용할 수있는 참조가 있습니까, 책이나 의사 결정 트리와 같은 일부 입력 변수를 기반으로 어떤 방법으로 결정 해야하는지 결정할 수 있습니까?
- 데이터베이스 스키마의 성숙
- 로그를 쿼리하는 방법
- 레코드를 다시 작성해야 할 확률
- 더 중요한 것 : 쓰기 또는 읽기 성능
- 기록되는 값의 특성 (문자열, 숫자, 얼룩)
- 사용 가능한 저장 공간
내가 아는 접근법은 다음과 같습니다.
1. 생성 및 수정 된 날짜 및 사용자에 대한 열 추가
테이블 예 :
- 신분증
- value_1
- value_2
- value_3
- created_date
- modified_date
- created_by
- modified_by
주요 단점 : 우리는 수정의 역사를 잃습니다. 커밋 후 롤백 할 수 없습니다.
2. 테이블 만 삽입
테이블 예 :
- 신분증
- value_1
- value_2
- value_3
- ...에서
- 에
- 삭제됨 (부울)
- 사용자
주요 단점 : 외래 키를 최신 상태로 유지하는 방법은 무엇입니까? 필요한 큰 공간
3. 각 테이블에 대해 별도의 히스토리 테이블 작성
히스토리 테이블 예 :
- 신분증
- value_1
- value_2
- value_3
- value_4
- 사용자
- 삭제됨 (부울)
- 타임 스탬프
주요 단점 : 모든 감사 된 테이블을 복제해야합니다. 스키마가 변경되면 모든 로그도 마이그레이션해야합니다.
4. 모든 테이블에 대한 통합 히스토리 테이블 작성
히스토리 테이블 예 :
- table_name
- 들
- 사용자
- new_value
- 삭제됨 (부울)
- 타임 스탬프
주요 단점 : 필요한 경우 레코드 (롤백)를 쉽게 다시 만들 수 있습니까? new_value 열은 거대한 문자열이어야하므로 다른 모든 열 유형을 지원할 수 있습니다.