지난 시간에는 테이블 생성 스크립트와 자동 게시물 삽입 스크립트를 살펴 보았습니다. 이번 시간에는 게시판 테이블에 레코드가 삽입되는 로직에 대해서 알아보겠습니다.
/****** 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. 사용자가 글을 입력
2. 이후로 10개 입력
3. 4번글의 답변글 입력
빨간색 부분을 유심히 보아 주시기 바랍니다.
답변글이 입력 될때는 부모글(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가 나중이어야 합니다.)
5. 새글 입력
6. 13번글의 답변글 입력
이해가 되십니까?
가장 상위의 ref 값을 게시물의 개수로 활용할 수도 있습니다.
MAX 함수를 쓰실 필요 없이 "SELECT TOP 1 ref FROM t3" 하시면 됩니다. index 가 걸려 있기 때문에..
이해가 빠르신 분들은 여기까지만 들어도 구현하실 수 있으리라 봅니다.
다음시간에는 asp페이지로 구현하는 부분에 대해서 설명하도록 하겠습니다.
감사합니다.
===============================
이성근 (rainn@rainn.pe.kr)
Soongsil Univ. Computer Science '95
(주)산그림닷컴
===============================
/****** 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 |
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
(주)산그림닷컴
===============================
'asp' 카테고리의 다른 글
대용량 게시판 만들기 강좌 #4/4 (WRITE, REPLY) (1) | 2007.05.02 |
---|---|
대용량 게시판 만들기 강좌 #3/4 (LIST) (2) | 2007.05.02 |
대용량 게시판 만들기 강좌 #1/4 (0) | 2007.05.02 |
이전 URL 검사하는 팁 (0) | 2007.05.02 |
ASP 서버변수 값들 확인 스크립트 (0) | 2007.05.02 |