엔티티 Post
을 가지고 간단한 튜플 볼이 완벽하게 정규화
ID User_ID Post_Param_A Comment
1 69 foo This is a post
. 그러나 게시물이 편집을 거쳐 변경 사항을 추적하려고합니다. 그래서 다른 필드를 추가하여 변경 사항을 추적합니다. 그러나 증분 값 대신 datetime 필드를 추가하는 것이 좋습니다.
ID EffDate User_ID Post_Param_A Comment
1 1/1/16 12:00 69 foo This is a post
이 두 가지 장점이 있습니다 변경 사항을 추적 할 경우이 버전이 저장 될 때 1), 어쨌든 알고 싶은 것, 2) 당신이 게시물을 찾기위한 가장 큰 증분 값을 찾을 필요는 없습니다 각 새 버전을 저장할 값을 지정하십시오. 현재 날짜와 시간 만 저장하면됩니다.
그러나 증분 값 또는 날짜가 있으면 문제가 발생합니다. 간단한 행에서 각 필드는 PK에 대한 함수 종속성을가집니다. 버전 행에서 User_ID 및 Post_Param_A는 PK에 대한 종속성을 유지하지만 Comment는 이제 PK 및 EffDate에 종속됩니다.
튜플은 더 이상 2nf가 아닙니다.
그래서 용액을 정규화하는 간단한 문제이다 함께
ID User_ID Post_Param_A
1 69 foo
ID EffDate Comment
1 1/1/16 12:00 This is a post
1 1/1/17 12:00 An edit was made
1 1/1/17 15:00 The last and current version (so far)
(ID, EffDate) 새로운 테이블의 복합 PK.
쿼리 최신 게시물을 읽을 수는 조금 복잡하다 :
select p.ID, v.EffDate, p.User_ID, p.Post_Param_A, v.Comment
from Posts p
join PostVersions v
on v.ID = p.ID
and v.EffDate = (
select Max(v1.EffDate)
from PostVersions v1
where v1.ID = p.ID
and v1.EffDate <= today)
and p.ID = 1;
이 보이는하고 인상적으로 빠른처럼 복잡 정말 아니다. 정말로 깔끔한 특징은 - "오늘"을 1/1/17 13:00과 바꾸면 결과가 두 번째 버전이됩니다. 따라서 동일한 쿼리를 사용하여 현재 또는 과거를 쿼리 할 수 있습니다.
마지막 줄 ("및 p.ID = 1")이 제거 된 상태에서 "오늘"쿼리의보기를 만들어 또 다른 멋진 기능을 얻을 수 있습니다. 이보기는 모든 게시물의 최신 버전을 표시합니다. 뷰에 트리거를 작성하면 현재 버전에만 관심이있는 앱이 기본 구조를 고려하지 않고 작업을 수행 할 수 있습니다.
거버는 # 2를 수행합니다. – Drew
# 1은 어쨌든 비정규 화됩니다. – Drew
@Drew 그래서 가장 좋은 방법은 무엇입니까? 별도의 테이블로 분리 하시겠습니까? –