MySQL 데이터베이스에서 관계형 데이터를 버전 화하기위한 패턴?


12

사용자가 레코드를 편집하고 해당 레코드의 이전 버전을 볼 수있는 프로젝트에 대한 접근 방식을 찾으려고합니다. 다음은 목록을 사용하여 단순화 된 예제 스키마입니다.

TABLE list (
  id int auto_increment primary key,
  user_id int, 
  title varchar(255)
);

TABLE list_tasks (
  id int auto_increment primary key,
  list_id int,
  title varchar(255),
  order int,
  is_complete tinyint
);

따라서 사용자가 들어 와서 목록을 여러 번 편집 (예 : 작업 추가 또는 제거, 작업 순서 변경, 완료 표시, 이름 변경 등) 한 다음 저장할 수 있습니다. 이 시점에서 목록과 작업의 '버전 2'를 생성하고 이전 버전을 볼 수는 있지만 목록에 액세스하면 항상 최신 버전을 얻습니다.

MySQL 데이터베이스에서 이런 방식으로 버전 데이터를 처리하기위한 일반적인 접근 방식 / 디자인 패턴이 있습니까?


그것들은 이것에 대한 라이브러리입니다. 예를 들어 최대 절전 모드를 사용하는 경우 최대 절전 모드가 있습니다. 따라서 DAO를 처리하는 프레임 워크가있는 경우 이와 같은 것이 있는지 검색하십시오.
— Walfrat

답변:


9

DB에서 그렇게하는 것이 일반적입니다. 항목 목록에 대한 개정을 추적하려는 점에서 왜곡되어 있습니다.

이를 수행하는 한 가지 방법은 다음과 같은 구조를 변경하는 것입니다.

Alter table lists add revision_id integer;
Alter table list_tasks add revision_id integer;

Create Table revisions
{
   id int autoincrement... (revision id)
   list_id int...
   revdate datetime...
}

사용자가 자신의 목록을 저장하면 revisions위 표에 새 개정을 작성하고 해당 값을 목록 항목에 list_tasks지정한 다음 개정 ID에 lists해당 ID를 '현재'개정으로 표시하십시오. 사용자가 항목을 편집 할 때 기존 항목을 편집하지 말고 새 개정 ID가있는 새 항목을 삽입 list하고 해당 개정으로 테이블을 업데이트 하여 현재 항목으로 표시하십시오.

그런 다음 현재 항목을 나열하려면 lists표에 지정된 현재 개정 ID의 항목을 나열하십시오 . 이전 버전을 찾아 보려면 개정 테이블에서 목록의 이전 개정 목록을 가져온 다음 해당 ID를 기반으로 개별 항목을 나열 할 수 있습니다.


5

이 솔루션은 별도의 감사 테이블을 사용합니다. 장단점이 있습니다. 기본 테이블에서 이전 레코드를 제거하는 것이 좋습니다. 성능 향상은 무시할 수 있습니다.

감사 된 각 테이블에 다음 필드를 추가하십시오.

AddUserID      int <whatever your system uses>
AddDateTime    datetime
UpdateUserID   int <whatever your system uses>
UpdateDateTime datetime
CurrentVersion int
IsDeleted      bit

데이터가 변경 될 때마다이 필드를 업데이트해야합니다. CurrentVersion은 1 씩 증가합니다 (레코드를 잠그는 방법으로 사용될 수 있지만 또 다른 질문입니다). IsDeleted는 "소프트 삭제"를 제공하므로 나중에 참조 할 수 있습니다.

별도의 감사 테이블 각 테이블에는 해당 _Archive 또는 _History 버전의 테이블이 있어야합니다. 이들은 같은 방식으로 색인을 생성 할 필요가 없습니다. 분명히 단일 기본 키 필드는 적용되지 않습니다. ID 필드와 UpdateDateTime에서 복합 키를 만들 수 있어야합니다.

트리거를 사용하면 (코드 내부 또는 외부의 변경 사항이 해결됩니다. 상황에 맞는지 결정할 수 있습니다.) 또는 기타 코딩, 레코드가 추가, 업데이트 또는 삭제되면 레코드 사본이 아카이브에 저장됩니다. / 역사 테이블. 모든 버전 및 기타 감사 필드가 유지됩니다. 사용자가 언제 무엇을했는지 알려줍니다. 테이블을 자신과 비교하여 레코드가 변경된시기 또는 추세를 확인할 수 있습니다.

나는 지난 몇 년 동안이 작품을 잘 보았습니다. 고려하지 않은 단점에 대해 듣고 싶습니다.


나는 GrandMasterB뿐만 아니라 이것을 높이고 있는데, 둘 다 훌륭하고 사용할 필요는 특정 요구에 대한 자세한 내용에 달려 있습니다.
— 마약 밀매 자

-2

이 기사를 자세히 읽어 보시기 바랍니다.

https://blog.jondh.me.uk/2011/11/relational-database-versioning-strategies/comment-page-1/#comment-373850

또 다른 방법은 테이블에 version_id 열과 현재 행을 지정하는 'current'플래그를 사용하는 것입니다. 업데이트가 필요할 때마다 새 행을 삽입하고 기존 버전 '현재'플래그를 0 / false로 설정하고 새로 추가 된 행을 1로 설정할 수 있습니다.

이렇게하면 현재 플래그가 설정된 뷰만 표시하는 뷰를 만들 수 있습니다.

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