2005/12/22

답변형 게시판 알고리즘

어디에서나 흔히 볼 수 있는 웹 게시판 알고리즘이긴 하나 때때로 계속 만들기 귀찮아서 올려둔다.


idx family childLevel Subject
1 1 1 글 1
3 1 2 [RE] 글 1
6 1 3 [RE][RE] 글 1
5 1 4 [RE] 글 1
2 2 1 글 2
4 2 2 [RE] 글 2


다음과 같은 구조로 되어야 한다. 마지막에 올린 답글이 가장 최상위에 올라오게 된다.

새로운 글을 시작할 경우 family 값은 TABLE에서 max 값을 가져오고 childLevel은 1로 시작하게 된다.
이때 새로운 글에 답변이 달리면 자연이 childLevel의 값은 자기 부모글의 childLevel보다 1 높은 값을 지니게 된다. 이때 childLevel이 1인 부모글에 답글을 달게 되면 처음 작성된 답변글이 childLevel값이 나중에 달린 childLevel 값과 같아지게 되므로 누가 가장 먼저 나올지 며느리도 모른다.

따라서 이문제를 해결하기 위해선 마지막에 올린 답글이 가장 최상위에 올라와야 한다는 걸 생각하면 다음과 같은 방법으로 문제를 풀 수 있다.

table에 새로운 답변글을 하나 더 인서트하기 전에 html 폼에서 넘어온 family 값과 childLevel 의 값(이미 1이 더해진 값)을 받아서 table에 같은 family 값을 가지면서 childLevel보다 높은 값은 하나씩 더 하면 문제가 해결된다. 위의 알고리즘은 지금 설명한 내용을 기준으로 다음과 같은 형태를 지니게 된다.


idx family childLevel Subject
1 1 1 글 1
7 1 2 [RE] 글 1
3 1 3 [RE] 글 1
6 1 4 [RE][RE] 글 1
5 1 5 [RE] 글 1
2 2 1 글 2
4 2 2 [RE] 글 2


단지 이렇게 할 경우 글을 family와 childLevel의 값으로 asc 혹은 desc 정렬를 하면 순차적으로 값은 가져올 수 있으나 얼마나 칸을 띄워야 하는지 이것에 대한 판단 기준이 없으므로 이 부분에 대해선 조금 더 생각해볼 필요가 있다.

혹은 childLevel에 1이 더해진 값이 이미 존재할 경우 update 하지 않는 방법도 있을 것이나 글쎄.. 이건 조금 더 생각해 볼일이다.

댓글 없음: