>> Read No. 2691 article  
게시판 리스트을 표시하기위한 최적의 테이블 디자
인및 쿼리문

등록 2002-07-23 16:05:00     조회 4
이름 김형숙    

					보통의 게시판을 작성할 때 게시물의 리스트를 보여줄 때 항상 나중에 쓴 글을 먼저 보
여주고<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
>&nbsp;라고 sorting 하는 구문에 대해서<br> 			더 정확히 알 게 되었을 때 <font color="blue">00</font>
이 <font color="blue">0001</font> 보다 order 로서 먼저 나온다는 사실을 알 게 되었고<br> 			<font colo
r="blue">000101</font>이 <font color="blue">0002</font> 보다 먼저 나온다는 것을 알았다. <br> 			그리고 
<font color="blue">ORDER BY</font>에서 여러 컬럼을을 <font color="blue">DESC</font>와 <font color="blue">ASC</f
ont> 로 할 수 있다는 것을 알 게 되었다.<br> 			그 결과 아래와 같이 테이블 구조를 가진다면
 그 리스트를 쉽게 한다면 훨씬 낮을 것이라 생각 한다.</p>  			<p>그래서 생각한 방법이 글
들을 그룹 ID 라는 항목으로 먼저 묵고 그 묵였진 그룹 ID 에 대해서 각각의 고요한<br> 			글 
번호 및 THREAD 라는 항목으로 ORDER BY 한다면 위에서 우리가 보여주고자 하는 리스팅이 된다
는 것을<br> 			알았다. 그 내용을 아래와 같이 설명해 본다.</p>  			<p>OZBoard 의 테이블 구조는
 아래와 같다. <br> 			&nbsp;<img src="http://www.dasangng.co.kr/~hskim/ozboard/overview/oz_overview01.gif" width="6
87" height="165" border="1"><br> 			<br> 			이 그림을 설명 하면 글번호 1번 이런식의 번호들은 쓴 순
서대로 받는 글번호(이후 brd_nid 로 칭함) 이며<br> 			 [일반] 의 앞에 숫자는 글은 실제 화면
에 보여주는 가상적인 글 번호 (이후 가상번호라 칭함) 이며<br> 			그룹번호 1번은 원본글과
 그 글에 리플까지 달린 글을 그룹으로 묶어서 그룹번호(이후 brd_gid)로 칭하며<br> 			thread 00
 이라고 하는 것은 리플의 단계 및 리플의 순서을 나타내며 이후 brd_thread로 칭한다.</p>  			<
p>위에 설명한 내용이 실제 db에 저장되었다면 아래와 같이 저장 될 것으로 보인다.<br> 			<im
g src="http://www.dasangng.co.kr/~hskim/ozboard/overview/oz_overview02.gif" width="264" height="148" border="1">&nbsp;</
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&nbsp;ozboard ORDER BY brd_gid DESC, brd_thread, brd_nid  ASC<br> 			</font>라고 한다
면 아래 그림과 같이 리스팅 된다.<br> 			&nbsp;<img src="http://www.dasangng.co.kr/~hskim/ozboard/overview/o
z_overview03.gif" width="267" height="152" border="1"><br> 			그럼다면 이 부분을 테이블의 인덱스로 만
들어서 리스트를 표현할 때 훨씬 유용하게 할 수 있다.</p> 			<p>위의 내용을 토대로 해서 만
들어질 게시판 스크립트는 아래와 같다.<br> 			&nbsp;<img src="http://www.dasangng.co.kr/~hskim/ozboard/ov
erview/oz_overview04.gif" width="474" height="354" border="1"><br> 		실제 위에 인덱스 만드는 컬럼중 brd_reg
date란 값이 있다. 이값을 인덱스 컬럼으로 하여도 되고<br>위에서 설명한 brd_nid 로 하여도 
된다. 즉 brd_regdate 와 brd_nid 는 계속 증가값이기 때문에<br>상관 없다.</p>   				<p>	위의 테이
블의 내용을 리스팅으로 표현 하자고 한다면 아래와 같이 SQL 문을 쓰면 된다.<br> 			<font colo
r="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>&nbsp;순서 이다.<br>간혹
 brd_nid, brd_thread asc 라고 한다면 원하는 결과을 얻기 힘들 것이다. </p> 				<p>아래 그림은 위
의 내용을 토대로 테스트 해본 결과 물이다.<br><img src="http://www.dasangng.co.kr/~hskim/ozboard/overvie
w/oz_overview05_mysql.gif" width="628" height="311" border="1">&nbsp;</p> 			<p>이상으로 OZBoard 의 테이블 Overv
iew 에 대해서 마친다.<br> 			질문 사항이나 참고 조언을 주실분은 아래의 주소로 메일을 주
시기 바랍니다.<br> 			<a href="mailto:oz at koreasquad.org">oz at koreasquad.org</a>, 							그리고 혹시 서버가 
안된다면<a href="mailto:oz4me at hanmail.net">oz4me at hanmail.net</a><font color="black"> 으로 보내셔도 됩니다.<
br> 			그리고 이 문서는 </font><a href="http://www.dasangng.co.kr/~hskim/ozboard/overview/ozboard_overivew01_mysq
l.html">http://www.dasangng.co.kr/~hskim/ozboard/overview/ozboard_overivew01_mysql.html</a><br> 			에서도 볼 수 있
다.</p>   			<p>이 글의 저작권은 저 김형숙에게 있습니다.. 딴 데로 퍼 날으셔도 되고 그 어
떤 매체에 기록 되어도 됩니다.<br> 			그러나 기록 될 경우 이 문서 전체을 그대로 넣어 주
시기 바랍니다. 그럼 감사합니다.</p>
이름
암호


>> 관련글
2691 게시판 리스트을 표시하기위한 최적의 테이블 디자인및 쿼리문  김형숙  2002.07.23  ....
  답장 RE: 멀티 인덱싱 이라는 걸....  devilhero  2002.07.26  ....
  목록보기 윗글 아랫글
글쓰기
답장쓰기 수정 삭제
정규표현식 [ 상세 검색 ]
페이지로딩: [ 0.91 초 ] 작업시간: [ 0.23 초 ]

Copyleft 1999-2026 by JSBoard Open Project
Theme Designed by IDOO All right reserved
[TOP]

적수네 동네
+
| 적수네 동네
| 공부방
| 리눅스 잡지 서고
| LSN 소스
| 링크 모음
+---+
게시판
+
| 떠들어보세!
| 질문과 답변
| 새소식과 정보
| 1원짜리 팁?
| 대화방
+---+
칼럼?
+
| 세하 훔쳐보기
| Welcome2nite
| 혜진의 염장판
+---+
리눅스 상표권
+
| 반대 서명란
| 토론 게시판
+---+
GNU
+
| GNU 선언문
| GNU GPL
| GNU 미러 목록
+---+
프로젝트?
+
| 리눅스카운터
| RC5DES
| 실질헌법 제작
+---+
커널 소식
+
| 안정 버젼: 2.4.14
+---+
테마 선택
+
LSN 방송국?
+
| OFF AIR
+---+
회원
+
| 로그인
+---+
[ 적수네 동네 ] [ 리눅스 상표권 독점 반대 ] [ 한글 리눅스 문서 프로젝트 ] [ KrLine ] [ 사랑넷 ] [ Valid HTML 4.0! ] [ SlashDot ] [ Freshmeat ]
Copyleft (C) 1998-2001 Byeong-Chan Kim . License
TIME: 1791021795
System by WYZsoft, HDD by I.O.Linux, Mizi Research, Embryo, WOWLINUX, Domain by SarangNet, Network by KrLine.