데이터베이스 항목의 변경 내역이있는 방법


21

데이터베이스 항목 (데이터)의 버전 관리를 허용하는 방법은 무엇입니까?

기사의 변경 사항을 되돌릴 수있는 컨텐츠 관리 시스템 기능을 생각해보십시오.

그들의 장단점은 무엇입니까?


1
정확히 어떤 버전을 원하십니까? 스키마 또는 데이터?
tdammers

1
데이터 버전을 지정하고 싶습니다. cms의 예를 유지하려면 기사 버전을 말하십시오 .
matcauthon

Datomic을 살펴볼 수 있습니다.
dan_waterworth

답변:


19

기본적으로 두 가지 접근 방식이 있습니다. 모든 이전 값이 저장된 감사 테이블 또는 테이블의 일부로 시작 / 종료 날짜를 포함하며 모든 업데이트는 이전 레코드를 닫으면서 새 레코드를 만듭니다.

업데이트 : SQL SERVER 2016은이를 디자인 패턴 / 테이블 유형으로 지원합니다 — https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017


4
따라서 첫 번째 접근 방식이 더 확장 가능할 수 있습니다. "아카이브 된"데이터에 거의 액세스하지 않으므로 데이터베이스 디자인을 최적화 할 수 있습니다. 그리고 작업대는 작게 유지됩니다. 복잡성에 따라 diff 만 저장할 수도 있습니다. memento 패턴 을 사용하는 것이 좋습니다 ?
matcauthon

1
사용법에 따라 트리거를 사용하여 테이블을 채우고 롤백 할 대상 및 거리를 선택하는 방법을 제공하는 것으로 충분할 수 있습니다.
jmoreno

답변에 오타가 있습니다 (패턴은 패턴이어야 함)
geocodezip

7

한 가지 아이디어는 "삽입 전용 데이터베이스"를 사용하는 것입니다. 기본 아이디어는 행에서 데이터를 삭제하거나 업데이트하지 않는 것입니다 .

추적 할 필요가 각 테이블이있을 것이다 datetime열을 from하고 to. 그것들 NULL은 각각 의 값 으로 시작합니다 (시간의 시작부터 끝까지). 행을 "변경"해야 할 경우 새 행을 추가하고 동시에 to이전 행 Nowfrom추가중인 행을 업데이트합니다 Now.

자세한 내용은 다음을 참조하십시오.

이 기술은 AuditTrail레거시 데이터를 관리하기 위해 호출 되며 일종의 변경 기록이 저장됩니다.

이 성격의 질문이 이미 게시 된 것처럼 보입니다.


슬프게도 그 질문은 삭제 된 것 같습니다 :(
Douglas Gaskell

문제 없습니다, 여기 링크가 있습니다. 링크 에서 또 다른 좋은 디자인 제안
Yusubov

2

각 테이블에 대해 트리거를 사용하고 _history (또는 이름을 지정할 수 있음)의 데이터를 유지할 수 있으며 모든 삽입, 업데이트, 기본 테이블에서 삭제하면 트리거가 트리거 되고이 테이블에 세부 정보를 저장할 수 있다고 생각합니다. SQLite 데이터베이스를 사용하는 경우에도 사용할 수 있습니다.

이 메커니즘은 대규모 프로젝트에도 유용합니다. 이 테이블에서 변경 시간 소인과 함께 변경 한 사용자의 정보를 로그 할 수 있습니다. 그런 다음 요구 사항에 맞는 시간 소인으로 테이블을 복원 할 수 있습니다.

모든 데이터베이스에는 트리거를 작성하고 코딩하는 고유 한 방법이 있습니다. SQLite를 사용 하는 경우 구문을 보려면 SQLite.org 를 방문하십시오 . 다른 데이터베이스의 경우 공식 사이트를 방문하십시오.


1

아마도 Sqlite DB 엔진에 대해 알고있을 것입니다 . 전체 db는 단일 파일로 저장됩니다. api는 가상 파일 시스템도 지원하므로 기본적으로 스토리지를 어디서나 어떤 형식 으로든 구성하고 특정 파일 오프셋에서 읽기 및 쓰기 작업에 응답 할 수 있습니다. 이를위한 가능한 응용 프로그램은 암호화, 압축 등일 수 있습니다. 컨테이너 계층이 데이터베이스, sql 또는 sqlite 파일 형식에 대해 알 필요가 없으며 xRead 및 xWrite 콜백을 준수하는 것이 가장 좋습니다.

아이디어 중 하나는 타임머신 기능을 구현하는 것이 었습니다. 따라서 모든 xWrite 작업은 "실행 취소"기록으로 덮어 쓰는 모든 세그먼트를 저장하며 사용자는 과거에 날짜를 선택하여 db에 포함 된 내용 (아마도 읽기 전용 모드)을 볼 수 있습니다. 나는 아직 예제를 가지고 있지 않지만 ( sqlite 메일 목록에서 그것에 대한 토론이 있었지만) 아마도 다른 엔진이 VFS API를 제공하므로 비슷한 것이 가능합니다. 그리고 일단 구현되면 복잡한 데이터베이스 구조와 호환되어야합니다.


이 방법이 더 큰 프로젝트에 확장 가능하다고 생각하십니까?
matcauthon

빅 데이터 변경에 큰 데이터 오버 헤드가 추가 될 수 있다고 생각합니다 (이전 버전의 압축이 도움이 될 수는 있지만 모든 단일 변경 사항을 저장해야하기 때문에). 스키마의 관점에서 볼 때 두 테이블에서 작동하는 한 스물 동안 작동합니다.
Maksee

1

데이터베이스 항목 버전 관리에 사용하는 방법은 감사 테이블을 사용하는 것입니다. 테이블에는 다음과 같은 스키마가 있습니다.

Seq      - Int      ' Unique identifier for this table
Event    - Char     ' Insert / Update / Delete
TblName  - Char     ' Table that had field value changed
FldName  - Char     ' Field that was changed
KeyValue - Char     ' delimited list of values for fields that make up the PK of table changed
UsrId    - Char     ' User who made the change
OldValue - Char     ' Old value (converted to character)
NewValue - Char     ' New value (converted to character)
AddTs    - DateTime ' When the change was made

그런 다음 추적하려는 테이블의 삽입 / 업데이트 / 삭제에 대한 트리거가 있습니다.

장점 :

  • 모든 데이터는 하나의 테이블에 있습니다
  • 테이블의 모든 필드 또는 특정 필드를 추적하도록 설정 가능
  • 테이블의 각 필드에 버전을 쉽게 표시

단점 :

  • 하나의 테이블에 모든 감사 정보가 있으면 매우 많은 수의 레코드가 생성됩니다.
  • 많은 트리거 필요

0

지금이 버전을하고 있습니다. 모든 레코드에 대해 삽입 날짜, 수정 날짜 및 활성 레코드 부울 플래그가 있습니다. 초기 삽입의 경우 삽입 날짜와 수정 날짜가 모두 Now () (이 예제는 Access에 있음)로 설정되고 활성 레코드 플래그가로 설정됩니다 true. 그런 다음 해당 레코드를 수정하면 전체 내용을 새 레코드에 복사하고 사용자가 변경하는 필드를 변경하고 삽입 날짜를 원본과 동일하게 유지하고 수정 날짜를 Now ()로 변경합니다. 그런 다음 원본 레코드의 Active Record 플래그를 뒤집고 false새 레코드를true . 또한 원래 레코드의 ID를 저장하는 ModifiedRecordsParentID 필드가 있습니다.

그런 다음 쿼리해야 할 경우 레코드를 반환 할 수 있으며 ActiveRecord = true최신 정보 만 얻을 수 있습니다.


ActiveRecord깃발이 필요 없습니다 . MAX (*) 행은 항상 현재 레코드 여야합니다. 이전 버전으로 복원하면 단순히 해당 행을 테이블에 다시 삽입합니다.
반전

선택 작업을 수행하는 방법을 잘 모르겠지만 이제는이 기능을 사용하고 있다고 생각하고 있습니다. hmmmm
Brad

일반적으로 MAX (column_name)은 테이블 열에서 가장 큰 값을 선택합니다. 전체 행을 선택하려면 간단 select top 1 order by id descending하게 수행하십시오.
반전

예, 간단한 단일 레코드에서 작동하지만 내 테이블은 한 번에 선택해야하지만 개별적으로 수정할 수있는 하위 레코드 모음입니다. 조금 더 복잡합니다.
Brad

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.