버전을 1 늘리는 요구 사항을 완화 할 수없는 경우 카운터를 사용하는 것이 좋습니다.
데이터에 대한 테이블을 만듭니다
create table file_details(id text primary key, fname text, mimetype text);
및 버전에 대한 별도의 테이블 :이 테이블은 모든 카운터 또는 전혀 카운터를 포함 할 수 있습니다 있기 때문에 별도의 테이블이 필요
create table file_details_version(id text primary key, version counter);
을 .
insert into file_details(id, fname, mimetype) values ('id1', 'fname', 'mime');
update file_details_version set version = version + 1 where id = 'id1';
그런 다음 file_details에서 읽기는 항상 최신을 반환합니다, 당신은 file_details_version에서 최신 버전 번호를 찾을 수 있습니다
그런 다음 업데이트를 당신은 할 수 있습니다.
그러나 이것에는 많은 문제가 있습니다. 카운터를 사용하여 원자 배치를 수행 할 수 없으므로 두 업데이트는 원자 적이지 않습니다. 일부 실패 시나리오는 유지되는 file_details에 대한 삽입으로 만 이어질 수 있습니다. 또한 읽기 분리가 없으므로 업데이트 도중 읽으면 두 테이블간에 일치하지 않는 데이터가 발생할 수 있습니다. 마지막으로 Cassandra의 카운터 업데이트는 오류를 허용하지 않으므로 카운터 업데이트 중에 오류가 발생하면 두 번 계산할 수 있습니다 즉 버전을 너무 많이 늘리십시오.
카운터를 포함하는 모든 솔루션이 이러한 문제에 부딪 힐 것이라고 생각합니다. 각 업데이트에 대해 고유 한 ID (예 : 큰 난수)를 생성하고이를 별도의 테이블에있는 행에 삽입하여 카운터를 피할 수 있습니다. 그러면 버전은 행에있는 ID의 수입니다. 이제 당신은 원자 적 업데이트를 할 수 있고, 실패는 실패에 관대 할 것입니다. 그러나 읽기 시간은 O (갱신 수)이고 읽기는 여전히 분리되지 않습니다.
매번 정확히 1 씩 버전이 증가해야합니까? 그렇지 않다면, fname과 mimetype에 대한 타임 스탬프의 최대 값은 항상 증가하는 숫자가 될 것이므로 버전 관리에 사용될 수 있습니다. – Richard
네, 버전을 정확히 1로 늘리라는 요구가 있습니다. 또한 fname과 mimetype에 대한 최대 타임 스탬프를 얻는 쿼리가 어떻게 될지 알려주실 수 있습니까? – Dawood
id = 'id';가있는 file_details에서'select writetime (fname), writetime (mimetype)을 사용할 수 있으며 코드에서 최대 값을 찾을 수 있습니다. – Richard