지난 시간에는 테이블 생성 스크립트와 자동 게시물 삽입 스크립트를 살펴 보았습니다. 이번 시간에는 게시판 테이블에 레코드가 삽입되는 로직에 대해서 알아보겠습니다.
/****** Object: Table [dbo].[t3] Script Date: 2003-07-19 오전 12:37:23 ******/ CREATE TABLE [dbo].[t3] ( [seq] [int] IDENTITY (1, 1) NOT NULL , [ref] [int] NOT NULL , [depth] [smallint] NOT NULL , [name] [varchar] (20) COLLATE Korean_Wansung_CI_AS NOT NULL , [email] [varchar] (50) COLLATE Korean_Wansung_CI_AS NULL , [password] [varchar] (16) COLLATE Korean_Wansung_CI_AS NOT NULL , [title] [varchar] (100) COLLATE Korean_Wansung_CI_AS NOT NULL , [writeday] [datetime] NOT NULL , [readnum] [smallint] NOT NULL , [ip] [varchar] (15) COLLATE Korean_Wansung_CI_AS NOT NULL , [content] [text] COLLATE Korean_Wansung_CI_AS NOT NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE [dbo].[t3] WITH NOCHECK ADD CONSTRAINT [PK_t3] PRIMARY KEY CLUSTERED ( [seq] DESC ) ON [PRIMARY] GO ALTER TABLE [dbo].[t3] ADD CONSTRAINT [DF_t3_depth] DEFAULT (0) FOR [depth], CONSTRAINT [DF_t3_writeday] DEFAULT (getdate()) FOR [writeday], CONSTRAINT [DF_t3_readcount] DEFAULT (0) FOR [readnum] GO CREATE INDEX [IX_t3] ON [dbo].[t3]([ref] DESC ) ON [PRIMARY] GO 간략한 테이블 명세표 입니다. seq : 글번호 ref : 글순서 depth : 답글깊이 name : 이름 email : email password : 암호 title : 제목 writeday : 글쓴시각 readnum : 조회수 ip : 글쓴이의 IP content : 내용 특징은 seq : PK (DESC) ref : Index (DESC) 라는 점 이외엔 없지요. ref 라는 컬럼은 글순서 입니다. 여러가지 ref 컬럼의 설계 로직들이 있었으나,
본 게시판에서 ref는 단순 정수형의 컬럼이면서 글 순서가 들어갑니다. 즉 시나리오는 다음과 같습니다. ----------------------------------------------- 1. 사용자가 글을 입력
seq ref depth
1 1 0

2. 이후로 10개 입력

seq ref depth
10 10 0
9 9 0
8 8 0
7 7 0
6 6 0
5 5 0
4 4 0
3 3 0
2 2 0
1 1 0

3. 4번글의 답변글 입력

seq ref depth
10 11 0
9 10 0
8 9 0
7 8 0
6 7 0
5 6 0
4 5 0
11 4 1
3 3 0
2 2 0
1 1 0

빨간색 부분을 유심히 보아 주시기 바랍니다.
답변글이 입력 될때는 부모글(seq:4, ref:4)이 있지요.
일단 부모글의 ref(4) 가 지금 들어갈 글(11번) 의 ref(=4)로 결정하고,
부모글의 ref(4였겠죠) 이상인 ref를 모조리 +1 update 합니다.
(query : update [테이블] set ref = ref + 1 where ref >= [부모글의 ref] )
depth는 항상 부모글의 depth + 1 해주면 간단합니다.

오래된 게시물일 경우 시간이 오래 걸리는 이유는 바로 이 때문입니다.
하지만 무시할만큼의 이유는 충분하다고 생각합니다. 게시판의 특성상...

이해를 돕기 위해 세가지 경우를 더 보여드립니다.

4. 11번글(4번글의 첫번째 답변글)의 답변글 입력

먼저 추측을 하면,
11번글(seq:11, ref:4) 이 부모글이니까
이번글의 ref는 4가 되겠죠. 그래서 일단 ref가 4 이상인 ref를 +1 시켜주고
자신의 ref를 4로서 insert 합니다.
(순서에 주의하셔야 합니다! update가 먼저고, insert가 나중이어야 합니다.)

seq ref depth
10 12 0
9 11 0
8 10 0
7 9 0
6 8 0
5 7 0
4 6 0
11 5 1
12 4 2
3 3 0
2 2 0
1 1 0

5. 새글 입력

seq ref depth
13 13 0
10 12 0
9 11 0
8 10 0
7 9 0
6 8 0
5 7 0
4 6 0
11 5 1
12 4 2
3 3 0
2 2 0
1 1 0
6. 13번글의 답변글 입력

seq ref depth
13 14 0
14 13 1
10 12 0
9 11 0
8 10 0
7 9 0
6 8 0
5 7 0
4 6 0
11 5 1
12 4 2
3 3 0
2 2 0
1 1 0


이해가 되십니까?

가장 상위의 ref 값을 게시물의 개수로 활용할 수도 있습니다.
MAX 함수를 쓰실 필요 없이 "SELECT TOP 1 ref FROM t3" 하시면 됩니다. index 가 걸려 있기 때문에..


이해가 빠르신 분들은 여기까지만 들어도 구현하실 수 있으리라 봅니다.
다음시간에는 asp페이지로 구현하는 부분에 대해서 설명하도록 하겠습니다.
감사합니다.


===============================
이성근 (rainn@rainn.pe.kr)
Soongsil Univ. Computer Science '95
(주)산그림닷컴
===============================

+ Recent posts