2012-08-16 4 views
0

나는 설계 한 주석 시스템을 가지고 있으며 중첩하지 않고 작업합니다. 이제 나는 사람들이 그 페이지에 일반적인 것이 무엇이든간에 직접적으로 의견에 답할 수있게하고 싶다. 그래서 부모 ID를 가리키는 내 데이터베이스에 상위 ID 열을 추가하는 방법에 대해 생각했습니다.중첩 된 주석 시스템 sql

이제 다음 단계 (이 문제를 해결하는 좋은 방법을 찾는데 문제가 있음). 중첩 된 주석이 부모에게 제대로 연결되도록 모든 공통된 "thing id"를 기반으로 모든 주석 (중첩 및 아닌)에 대한 데이터베이스를 쿼리 한 다음 정확한 순서로 표시하는 것입니다 ... 효율적인 방법이 있습니까? 재귀와 물건으로 이상한 쿼리 호출을 시작하지 않도록 이러한 모든 주석을 함께 주문 하시겠습니까? 모든 의견에는 다른 관련없는 데이터와 함께 타임 스탬프가 있습니다. 어떤 제안

+0

Easyest 방법은 두 쿼리를 사용하는 것입니다. 첫 번째 질의는 부모를 모두 선택하고, 두 번째는 자녀를 선택합니다. 또는 한 번에 모두 선택하고 parent_id를 키로 사용하여 배열에 배치하십시오. –

+0

실용적인 옵션은 아니지만 여전히 생각할 사항입니다. MongoDB와 같은 문서 지향 데이터베이스 (http://en.wikipedia.org/wiki/MongoDB)의 좋은 유스 케이스처럼 보입니다. . 게시물 내의 모든 게시물을 게시물에 저장 한 다음 해당 게시물의 각 주석에 중첩 된 주석을 저장할 수 있습니다. 게시를 위해 모든 데이터를 쿼리하는 것은 문서를 잡는 것만 큼 간단합니다. 조인은 필요하지 않습니다! 그러나 나머지 디자인은 MongoDB와 잘 작동하지 않을 수 있습니다. 그러나 제가 말했던 것처럼, 그것은 생각할만한 흥미로운 것입니다. – DaoWen

+0

중첩이 어떤 수준이라도 깊다면, 아마도 당신은 어떤 종류의 재귀를 피할 수 없을 것입니다. PHP에 익숙하다면, MySQL에서 얻은 배열을 재귀 적으로 사용할 수 있습니다. – dezso

답변

3

"중첩 된 세트"라는 개념 거기에 대한

감사합니다. 기본적으로 각 주석과 기사에는 하위 항목 집합의 "시작"과 "끝"을 지정하는 두 개의 열이 있습니다. 모든 코멘트에는 부모 항목의 집합 내에 완전히 시작과 끝이 있습니다. 형제 사이에 겹침이 없습니다. 두 세트가 겹치는 유일한 시간은 하나가 완전히 다른 시간대 인 경우입니다 (예 : 한 항목이 하위 항목 인 경우). 다른 쪽). 특정 항목에 대한 쿼리를 수행 할 때

        Article 
          /-----(1, 12)----\ 
         Comment     Comment 
        /---(2, 5)    /--(6, 11)--\ 
      Comment     Comment  Comment 
      (3, 4)      (7, 8)   (9, 10) 

, 당신은 세트 아이템의 세트 내에 일치하는 문서 ID를 가진 모든 항목을 찾습니다. 그것은 모든 아이들과 모든 아이들을 검색합니다. 시작 또는 끝으로 정렬하고 주석은 대부분 순서대로 표시되어야하며 다른 끝점과 비교하여 하나의 하위 항목인지 여부를 알 수 있습니다. (시작으로 정렬했는데이 항목의 끝이 이전 항목보다 작 으면 하위 항목이 있습니다.)

단점은 모든 주석은 해당 세트를 업데이트해야한다는 것입니다. 꽤 간단하지만 잠재적으로 매우 느립니다. 여기에 2를 가산함으로써 모든 '말단'> = 8, 그 기사 내용

  • 갱신 예를 들어, (7,8) 아래의 다른 아이템을 추가하기 위해.
  • 해당 기사의 경우 2를 더하여 '시작'을 8 개마다 업데이트하십시오.
  • (8, 9) 세트로 새 항목을 삽입하십시오.

삽입하는 사람이 "있는"경우 댓글이 더 많을수록 업데이트 속도가 느려집니다. on..lemme는 구글

잡아 ...

http://en.wikipedia.org/wiki/Nested_set_model