2017-12-06 1 views
1

Book 테이블, Page 테이블 및 Element 테이블이있는 삽입 전용 PostgreSQL 데이터베이스가 있습니다. 책은 여러 페이지를 가질 수 있으며 페이지는 여러 요소를 가질 수 있습니다. 데이터베이스는 페이지가 수정 될 때마다 감사를 위해 새 레코드에 해당 페이지의 새 버전이 만들어지기 때문에 삽입 전용입니다.삽입 전용 데이터베이스에 종속 요소가있는 초안 페이지를 작성하는 방법

------------- 
Book 
------------- 
id [PK] 

------------- 
Page 
------------- 
id [PK] 
book_id [FK] 
version 
created 

------------- 
Element 
------------- 
id [PK] 
page_id [FK] 
version 
created 

현재 요소 Page.id하는 외래 키 포인팅을 가지고 있으며, 페이지 Book.id.에 외래 키 포인팅이있다

모든 요소를 ​​포함 할 수있는 독립적 인 페이지 초안 (버전)이 있어야합니다. 새 페이지 초안 (버전)이 만들어 질 때마다 새 초안은 이전 버전의 복제본이어야하며 이전 버전의 모든 요소를 ​​포함해야합니다. 요소 레코드는 삭제되지 않지만 특정 버전의 페이지에 요소를 추가하거나 제거 할 수 있습니다.

확장 성을 위해 요소가 매우 큰 숫자 일 수 있으므로 페이지와 함께 모든 요소를 ​​복제하지 마십시오. 또한 페이지와 요소 사이의 다 대다 관계를 피하는 것이 좋습니다.

필자는 Element.page_id FK를 Element.book_id FK로 대체하여 하나의 요소와 페이지가 서로 느슨하게 결합되도록하려고했습니다. 이렇게하면 페이지를 복제 할 때 모든 요소를 ​​복제 할 필요가 없지만 각 요소를 특정 버전의 페이지와 연관시키는 방법이 필요합니다.

이상적으로는 단일 SQL 쿼리로 해당 버전과 관련된 모든 요소가 포함 된 페이지 버전을 검색 할 수 있어야합니다.

아직 디자인/프로토 타입 단계에 있으므로 데이터베이스의 모든 부분이 요구 사항을 충족하도록 잠재적으로 변경 될 수 있습니다.

위의 요구 사항에 따라 페이지와 요소를 연결하는 가장 좋은 방법은 무엇일까요? 요구 사항이 명확하길 바란다. 그렇지 않다면 질문을하고 명확하게하려고 노력할 것이다.

참고 : "삽입 전용"데이터베이스 란 레코드가 업데이트되거나 삭제되지 않고 삽입되는 데이터베이스를 의미합니다. 이는 감사 용도로 사용되므로 편집 활동에 대한 전체 기록을 보유 할 수 있습니다.

답변

1

가능한 해결책은 페이지의 단항 관계 (각 페이지에는 부모 Page_id가 있음)입니다.

  1. 고유 한 요소가있는 각 새 페이지를 삽입 할 수 있습니다. (부모가없는 경우)
  2. 기존 페이지의 새 버전이 있으면 상위 페이지 ID가있는 새 페이지를 삽입 할 수 있습니다.
  3. 상위 페이지 요소를 새 페이지로 설정할 필요가 없습니다. (페이지에서 상위 페이지에서 해당 페이지를 검색 할 수 있음)
  4. 새 버전의 요소가 특정 요소 인 경우이를 새 다가오는 페이지로 설정할 수 있습니다.
  5. 등등.

PostgreSQL은 재귀 쿼리에서 놀라운 성능을 제공합니다.

+0

이것은 흥미로운 해결책입니다.하위 페이지에서 요소를 업데이트하려고하지만 부모 페이지에 속하는 경우 동일한 하위 식별자가 있지만 더 최근의 'created'날짜가있는 하위 페이지에 새 요소를 추가 할 수 있습니다. 이 방법으로 하위 페이지의 모든 요소를 ​​쿼리하려면 고유 해시 및 가장 최근에 생성 된 날짜가있는 요소를 사용할 수 있습니다. –

관련 문제