보통의 게시판을 작성할 때 게시물의 리스트를 보여줄 때 항상 나중에 쓴 글을 먼저 보여주고
그리고 해당 게시물의 리플라이역시 쓰여진 글 순서에 관계없이 항상 원본글이후로 보여주는
리스트을 작성해야 한다. 그렇기 하기 위해서 나도 많은 생각을 하게 되었다.
제가 첨에는 게시판 테이블을 만들 때 인덱스의 개념과 SQL에 대한 기초 지식 부족으로 아주 간단히 테이블
을 만들고 기 리스트의 구현을 프로그램으로 복잡하게 한 적이 있다.
이 구현방법은 여기서 설명 하면 난 너무 허접 프로그래머로 전락 하기에 설명하지 않겠지만 지금 생각해 보면
정말 -100점짜리 로직이었다.. 반성하고 있다. .지금 이 시점에서..
그 이후 항상 최상의 리스팅 로직이 없을까 고민 하다 SQL문에서 ORDER BY 라고 sorting 하는 구문에 대해서
더 정확히 알 게 되었을 때 00이 0001 보다 order 로서 먼저 나온다는 사실을 알 게 되었고
000101이 0002 보다 먼저 나온다는 것을 알았다.
그리고 ORDER BY에서 여러 컬럼을을 DESC와 ASC 로 할 수 있다는 것을 알 게 되었다.
그 결과 아래와 같이 테이블 구조를 가진다면 그 리스트를 쉽게 한다면 훨씬 낮을 것이라 생각 한다.
그래서 생각한 방법이 글들을 그룹 ID 라는 항목으로 먼저 묵고 그 묵였진 그룹 ID 에 대해서 각각의 고요한
글 번호 및 THREAD 라는 항목으로 ORDER BY 한다면 위에서 우리가 보여주고자 하는 리스팅이 된다는 것을
알았다. 그 내용을 아래와 같이 설명해 본다.
OZBoard 의 테이블 구조는 아래와 같다.
이 그림을 설명 하면 글번호 1번 이런식의 번호들은 쓴 순서대로 받는 글번호(이후 brd_nid 로 칭함) 이며
[일반] 의 앞에 숫자는 글은 실제 화면에 보여주는 가상적인 글 번호 (이후 가상번호라 칭함) 이며
그룹번호 1번은 원본글과 그 글에 리플까지 달린 글을 그룹으로 묶어서 그룹번호(이후 brd_gid)로 칭하며
thread 00 이라고 하는 것은 리플의 단계 및 리플의 순서을 나타내며 이후 brd_thread로 칭한다.
위에 설명한 내용이 실제 db에 저장되었다면 아래와 같이 저장 될 것으로 보인다.
위에 brd_thread에 대해서 설명을 부연 하자면..
레벨을 리플의 깊이로 정한다면 1번과 2번은 0레벨의 글이며
3,4번은 1레벨글이며 5,6은 2레벨 글이다.
3번글은 2번글의 리플이기에 brd_gid 가 2가 되며 brd_thread는
그당시 다른 1레벨의 리플이 없기 때문에 brd_thread가 0001이된다.
그리고 4번글은 역시 2번글의 1레벨 리플이지만 먼저 3번글이 2번글의 1레벨 리플이 있기에.
brd_thread가 0002가 된것이다.
이와 같이 5,6번 글도 brd_thread가 000101, 000202 이 된다.
이렇게 확장 할 경우 각 레벨당 리플될 수 있는 총글 수는 99개 이고
레벨의 총수는 정하기 나름이다.
그럼지만 너무 많은 리플은 일어 나지 않기에 난 9레벨까지의 리플을 허용하고 있다.
이 그림 대로 저장된 내용들을 SQL문을 사용해서 게시판 형식으로 할려면
SELECT brd_nid, brd_gid, brd_thread FROM ozboard ORDER BY brd_gid DESC, brd_thread, brd_nid ASC
라고 한다면 아래 그림과 같이 리스팅 된다.
그럼다면 이 부분을 테이블의 인덱스로 만들어서 리스트를 표현할 때 훨씬 유용하게 할 수 있다.
위의 내용을 토대로 해서 만들어질 게시판 스크립트는 아래와 같다.
실제 위에 인덱스 만드는 컬럼중 brd_regdate란 값이 있다. 이값을 인덱스 컬럼으로 하여도 되고
위에서 설명한 brd_nid 로 하여도 된다. 즉 brd_regdate 와 brd_nid 는 계속 증가값이기 때문에
상관 없다.
위의 테이블의 내용을 리스팅으로 표현 하자고 한다면 아래와 같이 SQL 문을 쓰면 된다.
SELECT * FROM ozboard USE INDEX (IX_ozboard) ORDER BY brd_gid DESC, brd_thread, brd_nid ASC
라고 한다면 우리가 진정으로 원하는 리스트가 될 것이다.
여기서 중요한 것은 ORDER BY brd_gid DESC, brd_thread, brd_nid ASC 순서 이다.
간혹 brd_nid, brd_thread asc 라고 한다면 원하는 결과을 얻기 힘들 것이다.
아래 그림은 위의 내용을 토대로 테스트 해본 결과 물이다.
이상으로 OZBoard 의 테이블 Overview 에 대해서 마친다.
질문 사항이나 참고 조언을 주실분은 아래의 주소로 메일을 주시기 바랍니다.
oz@koreasquad.org, 그리고 혹시 서버가 안된다면oz4me@hanmail.net 으로 보내셔도 됩니다.
그리고 이 문서는 http://www.dasangng.co.kr/~hskim/ozboard/overview/ozboard_overivew01_mysql.html
에서도 볼 수 있다.
이 글의 저작권은 저 김형숙에게 있습니다.. 딴 데로 퍼 날으셔도 되고 그 어떤 매체에 기록 되어도 됩니다.
그러나 기록 될 경우 이 문서 전체을 그대로 넣어 주시기 바랍니다. 그럼 감사합니다.
|