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.