2012-03-29 3 views
1

사용자가 각 항목에 대한 의견을 제출할 수있는 주석 시스템을 만들었습니다.관련 리비전이있는 레코드를 쿼리하는 중

그것은 프로젝트/범위 크립 비트로 바뀌었고 이제 사용자가 원래 주석을 편집하고 해당 주석을 추적 할 수있는 기능을 구현해야합니다. 입력 (신규 또는 기존)

comment_id, revision_id, timestamp 

모든 의견 :

모든 의견은 이제 수정 추적해야한다는

comments: id, comment, item_id, timestamp 

, 나는 새 테이블 제목 개정을 만든 주석 테이블에 있습니다 주석 테이블에 사용자가 기존 주석을 수정하기로 결정하면 주석에 새 레코드로 입력 된 다음 개정 테이블에 기록됩니다. 새 메모가 주석 표에 입력되면 작성된 ID를 사용하여 revisions.reivison_id로 전달하고 revisions.comment_id에 사용자가 수정 한 원래 주석의 ID를 채 웁니다 (희망 사항 ' 너를 잃어 버림). 내가 추가 이제

select * from comments where item_id = 1 

같은의 쿼리를했을 특정 항목에 대한 모든 코멘트 목록을 표시해야합니다

지금 내가 도움을 필요로하는 문제에 왔어요 리비전 테이블, 특정 항목에 대한 주석 목록을 검색해야하며 (위 쿼리와 동일), 주석을 수정 한 경우 해당 주석의 최신 버전을 반환해야합니다.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

주석 테이블의 모든 주석을 검색하고, 배열에 저장하고, revisions.comment_id를 별개로 설정하는 개정 테이블 내의 모든 레코드를 반환하는 다른 쿼리를 실행하는 것에 대해 생각했습니다. 단지 전용 (일부 개정 대부분의 원이 각 주석의 최신 버전을 표시하는 가장 좋은 방법은 무엇이

select comment_id DISTINCT, revision_id, timestamp 
from revisions order by timestamp desc 

같은 최근 한

개정 쿼리 ​​보일 수 있습니다 뭔가를 반환하려면 '티)?

나는 SQL 전문가가 아니므로 SQL을 사용하여 수행 할 수 있습니다. 또는 두 개의 다른 쿼리를 실행하고 별도의 배열에 데이터를 저장 한 다음 각 배열을 실행하고 해당 주석의 이전 버전을 비교 및 ​​제거해야합니다 ? 단 하나 개의 쿼리를 실행하는 방법이 그렇다면, 당신은을 가장 좋은 방법 제공 할 수있는 코멘트의 가장 최근 버전의 목록을 반환이 있다면 내가 상상

foreach($revisions as $r): 
$comments = strip key/value from comments array where $r['comment_id'] is 
found in comments array 
endforeach; 

return $comments; // return the comments array after it was stripped of the older comments 

아래의 예 (이론 부분) 그렇지 않으면 두 배열에 대한 두 개의 쿼리와 주석 배열의 값을 가장 좋은 방법 또는 더 나은 방법으로 스트립하는 것입니까?

미리 감사드립니다.

답변

2

우선 두 가지 대안 에 추가 한 다음 현재 스키마를 처리하기 위해 쿼리로 편집하겠습니다.

옵션 1 - 댓글에 deleted 플래그를 추가하십시오.의견이 수정되면 이미 수행 한 것처럼 수행하고 원본을 삭제 된 것으로 다시 작성합니다. 그렇다면 적극적인 의견을 원하면 WHERE deleted = 0이 필요합니다.

옵션 2 - 수정 테이블을 주석 테이블의 복제본으로 변경하고 수정본이 작성되었을 때 추가 필드를 변경하십시오. 이제 주석을 수정할 때마다 주석에 새 레코드를 만들지 말고 단지 existign 행을 업데이트하고 수정 행 테이블에 새 행을 추가하십시오. 이는 트리거를 통해 쉽게 유지 보수되며 매우 표준적인 감사 패턴입니다.


편집 옵션 3 - 쿼리는 스키마에 대처합니다. 내가 코멘트를 할 경우

바와 같이

, 다음, 나는 ...이에

id | comment | item_id | timestamp 
----+--------------+---------+----------- 
    1 | Hello,  | 1 | 13:00 
    2 | World!  | 1 | 14:00 
    3 | Hello, World | 1 | 15:00 

comment_id | revision_id | timestamp 
-----------+-------------+----------- 
    1  |  2  | 14:00 
    2  |  3  | 15:00 

자료를 이런 식으로 뭔가를 얻을 수 (기타 작업없이) 두 번 편집, 라이브 코멘트는 단 하나입니다 수정 표에 항목이 없으면 ...

+0

나는 옵션 1을 좋아합니다. 실제로는 약 8 개의 표가 있지만 두 개의 표를 예로 사용합니다. 그렇지 않으면 설명하려고 혼란스러워 할 것입니다. – Brad

관련 문제