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