문제

사용자 테이블(사용자 ID, 이름, 성)과 사용자 메타데이터 테이블(사용자 ID, 코드, 콘텐츠, 생성 날짜/시간)이 있는 postgres 데이터베이스가 있습니다.각 사용자에 대한 다양한 정보를 usermetadata 테이블에 코드별로 저장하고 전체 기록을 유지합니다.예를 들어 사용자(사용자 ID 15)는 다음과 같은 메타데이터를 갖습니다.

15, 'QHS', '20', '2008-08-24 13:36:33.465567-04'  
15, 'QHE', '8', '2008-08-24 12:07:08.660519-04'  
15, 'QHS', '21', '2008-08-24 09:44:44.39354-04'  
15, 'QHE', '10', '2008-08-24 08:47:57.672058-04'  

모든 사용자 목록과 다양한 사용자 메타데이터 코드 각각의 최신 값을 가져와야 합니다.저는 이 작업을 프로그래밍 방식으로 수행했는데, 물론 엄청나게 느렸습니다.SQL에서 제가 알아낼 수 있는 최선의 방법은 하위 선택에 참여하는 것이었습니다. 이 역시 속도가 느리고 각 코드에 대해 하나씩 수행해야 했습니다.

도움이 되었습니까?

해결책

나는 당신이 스키마를 수정할 의향이 없다고 생각하므로 내 대답이 별로 도움이 되지 않을 수도 있지만 여기에 있습니다...

한 가지 가능한 해결책은 '지원 중단 날짜'를 대신 삽입할 때 새로운 값으로 대체될 때까지 시간 필드를 비워 두는 것입니다.또 다른 방법은 '활성' 열을 사용하여 테이블을 확장하는 것입니다. 하지만 이렇게 하면 약간의 중복이 발생합니다.

일반적인 해결 방법은 'Valid-From' 및 'Valid-To' 필드를 모두 갖고 다른 항목이 유효해질 때까지 'Valid-To' 필드가 비어 있는 것입니다.이는 트리거 등을 사용하여 쉽게 처리할 수 있습니다.제약 조건을 사용하여 각 유형에 유효한 항목이 하나만 있는지 확인하면 데이터 무결성이 보장됩니다.

이들의 공통점은 현재 필드 세트를 결정하는 단일 방법이 있다는 것입니다.활성 사용자와 NULL '유효 기간' 또는 '지원 중단 날짜' 또는 실제 '활성'이 있는 모든 항목을 선택하기만 하면 됩니다.

Wikipedia 항목을 살펴보는 데 관심이 있을 수도 있습니다. 임시 데이터베이스 그리고 기사 시간 데이터베이스 개념에 대한 합의 용어집.

다른 팁

"DISTINCT ON" 절 (DISTINCT ON은 표준 SQL이 아님) 라코 디스

이렇게하면 반환 된 결과가 고유 코드 당 첫 번째 결과로 제한되며 생성 시간을 내림차순으로 정렬하면 최신 결과를 얻을 수 있습니다.

하위 선택은 이러한 작업을 수행하는 표준 방법입니다.UserId, Code 및 Date에 대한 고유 제약 조건 만 있으면 다음을 실행할 수 있습니다. 라코 디스

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top