본문 바로가기
Programming/> Database

[DB] 계단형 게시판 DB구조

by 니키ᕕ( ᐛ )ᕗ 2014. 7. 31.

※공부하는 겸 쓰는 글입니다 잘못된 정보가 있다면 댓글로 지적해주세요!



계단형 게시판의 예 (사진은 아라공 CCNA 덤프게시판)


 흔히 계단형 게시판이라면 위에처럼 생긴 것을 말한다. 계단형 게시판은 일반 데이터와는 다르게 종속성을 가지고 있어야 하므로 부모의 정보를 가지고 있어야 하고 게시판 리스트에서 몇번째에 위치하는지를 나타내야 한다.


 처음 게시판을 공부할 때에 고민했던 것은 답글에서 등록시간이 빠른 것과 늦은 것 중 어떤 것이 위로 올라와야하는가였다. 사실 나의 상식.. 으로는 등록시간이 늦은 것이 위로 오는 것이 맞다고 생각했는데 강사님께서는 게시판글에서 최신글이 위로 오기 때문에 답글 역시 최신글이 위쪽으로 오게하여 답글이 다른 페이지로 넘어갔을 때도 이를 유지하는게 정석이라고 하셨기에... 일단 그대로 갈 것이다.



1. 테이블을 생성한다.

tbl_bbs라는 이름의 테이블을 생성하고 컬럼명은 다음과 같이 준다.

bbsno

grpno 

 grpord

depth

title 

writer 


bbsno : 글번호, 게시판 글이 가지고 있는 고유 값

grpno : 글의 그룹 번호, 해당 게시판이 어떤 게시글에 속해있는지 나타냄. 부모의 값. 원글의 경우 자기 자신의 값

grpord : 그룹내의 순서,  부모 게시글에 소속된 게시글의 순서. 이거는 아래에서 더 자세하게 다루겠다

depth : 게시판의 depth, 답글에 답글일수록 depth가 커진다

title : 제목 / writer : 글쓴이 



2. 원글을 두개 작성한다


 bbsno

grpno 

grpord 

 depth

title 

writer 

 2

2

 1

2번째 글 

작성자2 

 1

 1

1번째 글 

작성자1 

원글 : 게시판 리스트 화면에서 게시글 작성을 눌렀을 때 생성되는 게시글

답글 : 게시판 상세화면에서 답변하기를 눌렀을 때 생성되는 게시글


 사실 여기는 별로 설명할 것은 없다. 원글은 기본적으로 게시글 그룹을 이루는 부모이기 때문에 grpno가 자신의 고유값으로 나타난다. 또한, 항상 그룹 내에 최상단에 위치해있어야 하기 때문에 grpord은 0을 가진다. 원글은 depth의 값을 1로 가진다.



3. 원글에 답글을 작성한다


 bbsno

grpno 

grpord 

depth

title 

writer 

2

2

 1

2번째 글 

작성자2 

3

2

1

 2

RE:2번째 글

작성자1

1

 1

1번째 글 

작성자1 


 2번 글에 답글을 달았다. 답글은 해당 답글이 달리는 원글의 bbsno를 grpno로 가지게 되고 그 아래에 위치하기 때문에 grpord는 {원글의 grpord + 1} 이 된다. depth는 {부모글의 depth + 1}이 된다.



3. 원글에 답글을 한 개 더 작성한다


 bbsno

grpno 

grpord 

depth

title 

writer 

2

2

 1

2번째 글 

작성자2 

4

2

1

 2

RE:2번째 글

작성자3 

3

2

2

 2

RE:2번째 글

작성자1

1

 1

1번째 글 

작성자1 


 2번 글에 다시 답글을 달았다. 새로 추가된 4번 글은 기존의 3번 글이 가지고 있던 순서를 차지하게 된다. 따라서 4번글이 추가되는 동시에 3번글의 grpord값 역시 변해야 된다. 쿼리로는 다음과 같이 하면 될 것이다.

UPDATE tbl_bbs SET grpord = grpord +1 WHERE grpno = 2 AND grpord  > 0



3. 답글에 답글을 작성한다


 bbsno

grpno 

grpord 

depth

title 

writer 

2

2

1

2번째 글 

작성자2 

4

2

1

2

RE:2번째 글

작성자3 

5

2

2

3

RE:RE:2번째 글

작성자4

3

2

3

2

RE:2번째 글

작성자1

1

 1 

1

1번째 글 

작성자1 


 답글에 답글을 작성해본다. 작성된 5번글은 여전히 같은 grpno값을 가진다. 여태까지 부모글을 게시글 그룹의 기준이 되는 원글로 지칭했는데 답글의 답글이라고 해서 해당 글이 달린 상위 글을 말하진 않는다. 그냥 그 글이 달린 그룹의 최상위에 존재하는 게시글이라고 보는게 더 정확할 것 같다. 추가된 답글이라고 해서 딱히 특별한 것은 없다. 답글의 답글이 생성될 때, depth는 상위 글(4번)의 depth+1이 될 것이고 grpno는 상위글(4번)의 grpno+1이 될 것이다. 답글의 답글이 원글의 답글 사이에 생성되었으므로 grpord가 4번이 가지고 있던 값인 1보다 큰 모든 게시글의 grpord가 바뀌게 된다. 

예 : 4번글(1) , 새로 추가 될 5번글(2), 그 아래에 있던 3번글(2->3)

UPDATE tbl_bbs SET grpord = grpord +1 WHERE grpno = 2 AND grpord  > {4번글의 grpno}



- 게시판 리스트로 불러올 때

select * from tbl_bbs order by grpno desc, grpord asc
 

 테이블에 저장 되어있는 게시글들을 불러올 때는 위와같이 불러올 수 있다. (mySQL 기준) 오라클이면 다른 방법으로 불러올 수 있을 것 같은데 난 오라클은 이상하게 어렵다....-ㅅ-

'Programming > > Database' 카테고리의 다른 글

[DB] MySQL 설정  (0) 2014.08.11

댓글