본문 바로가기
DataBase/MySQL, MariaDB

답변형 게시판 (OZBoard)

by ojava 2011. 1. 31.
반응형

답변형 게시판에는 여러 방법이 있겠지만, 간단하게 게시글의 정렬이 가능한
OZBozrd에 관련된 내용을 포스팅합니다. 출처는 글 안에 있습니당~


1. OZBoard OverView -- 01        
             
            보통의 게시판을 작성할 때 게시물의 리스트를 보여줄 때 항상 나중에 쓴 글을 먼저 보여주고
            그리고 해당 게시물의 리플라이역시 쓰여진 글 순서에 관계없이 항상 원본글이후로 보여주는
            리스트을 작성해야 한다. 그렇기 하기 위해서 나도 많은 생각을 하게 되었다.                          

제가 첨에는 게시판 테이블을 만들 때 인덱스의 개념과 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
            에서도 볼 수 있다.

                                         

이 글의 저작권은 저 김형숙에게 있습니다.. 딴 데로 퍼 날으셔도 되고 그 어떤 매체에 기록 되어도 됩니다.
            그러나 기록 될 경우 이 문서 전체을 그대로 넣어 주시기 바랍니다. 그럼 감사합니다.

반응형