그누보드 태그 지원 정보
그누보드 태그 지원본문
태그 관련을 공부중입니다.
https://docker.apachezone.com/blog/167 ==> 사이트가 close됨
대략적인 데이타베이스 구조는 나온 것 같고...
나리야 처럼 편하게 할 것 인지, 아니면 정통으로 갈것인지, 좀 더 봐야 될 것 같습니다.
필요한 것들은 나중에 추가 하면 되고..
그누보드에 넣어서 동작시키게 하는 것이 가장 큰 걱정거리네요.
이것이 되면 카테고리 기능(2-3단계..), 신고기능 등이 모두 비슷하게 다대다 구조로 되어 있으니
쉽게 구현이 될 것 같습니다.
===============
그누보드에서는 공식적으로 태그를 지원안함.
나리야의 태그를 분석해 보자.
태그 테이블 (가칭: g5_tag)
DROP TABLE IF EXISTS `g5_na_tag`;
CREATE TABLE IF NOT EXISTS `g5_na_tag` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` tinyint(4) NOT NULL DEFAULT '0',
`idx` varchar(10) NOT NULL DEFAULT '',
`tag` varchar(255) NOT NULL DEFAULT '',
`cnt` int(11) NOT NULL DEFAULT '0',
`regdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
KEY tag (`tag`, `lastdate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
id
: 자동 증가하는
type
:
idx
:
tag
: 태그 이름
cnt
:
regdate
:
lastdate
:
태그 테이블과 게시판 테이블을 연결해주는 중간 테이블 (가칭 g5_write_tag)
DROP TABLE IF EXISTS `g5_na_tag_log`;
CREATE TABLE IF NOT EXISTS `g5_na_tag_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`bo_table` varchar(20) NOT NULL default '',
`wr_id` int(11) NOT NULL default '0',
`tag_id` int(11) NOT NULL DEFAULT '0',
`tag` varchar(255) NOT NULL DEFAULT '',
`mb_id` varchar(255) NOT NULL DEFAULT '',
`regdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY tag (`tag`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
id
: 자동 증가
bo_table
: 게시판
wr_id
: 게시판 아이디
tag_id
: g5_na_tag의 id를
tag
: 태그 (중복)
mb_id
: 작성자
regdate
: 만들어진 시간 (중복?)
태그를 읽어 온다고 하면 (sql)
SELECT
g5_write_qa.wr_id,
g5_write_qa.wr_subject,
g5_write_qa.mb_id,
g5_na_tag.tag
FROM g5_write_qa
JOIN g5_na_tag_log ON g5_write_qa.wr_id = g5_na_tag_log.wr_id
JOIN g5_na_tag ON g5_na_tag.id = g5_na_tag_log.tag_id
WHERE g5_na_tag_log.bo_table = 'qa'
SELECT
g5_write_free.wr_id,
g5_write_free.wr_subject,
g5_write_free.mb_id,
g5_na_tag.tag
FROM g5_write_free
JOIN g5_na_tag_log ON g5_write_free.wr_id = g5_na_tag_log.wr_id
JOIN g5_na_tag ON g5_na_tag.id = g5_na_tag_log.tag_id
WHERE g5_na_tag_log.bo_table = 'free'
중간테이블에 여러 데이타를 넣은 이유는 아마도 읽어 올때
JOIN
을 쓰지 않을려고???
우선 g5_tag는 아래와 같이 넣고
DROP TABLE IF EXISTS `g5_tag`;
CREATE TABLE IF NOT EXISTS `g5_tag` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '',
//x `mb_id` varchar(20) NOT NULL,
`bo_table` varchar(20) NOT NULL DEFAULT '',
`createdAt` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
`updatedAt` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
PRIMARY KEY (`id`)
KEY tag (`tag`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
중간 테이블은 g5_write_tag는 다음과 같이 그냥 간단하게
DROP TABLE IF EXISTS `g5_write_tag`;
CREATE TABLE IF NOT EXISTS `g5_write_tag` (
`wr_id` int(11) NOT NULL,
`tag_id` int(11) NOT NULL,
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
JOIN으로 읽어오기
SELECT
g5_write_free.wr_id,
g5_write_free.wr_subject,
g5_write_free.mb_id,
g5_tag.name
FROM g5_write_free
JOIN g5_write_tag ON g5_write_tag.wr_id = g5_write_free.wr_id
JOIN g5_tag ON g5_tag.id = g5_write_tag.tag_id
WHERE g5_tag.bo_table = 'free'
다대다의 관계로 설정 가능한것
태그, 신고 : 사용자가 작성 가능함.
카테고리 : 어드민만 카테고리 작성가능
태그 쓰기
SET @wr_id = 1;
INSERT IGNORE INTO g5_tag (name, bo_table)VALUES ('태그', 'tag');
SET @tag_id = LAST_INSERT_ID();
INSERT INTO g5_tag_write (wr_id,tag_id) VALUES(@wr_id, @tag_id);
INSERT IGNORE INTO g5_tag (name, bo_table) VALUES ('태그테스트', 'tag');
SET @tag_id = LAST_INSERT_ID();
INSERT INTO g5_tag_write (wr_id,tag_id) VALUES(@wr_id, @tag_id);
INSERT IGNORE INTO g5_tag (name, bo_table) VALUES ('아파치', 'tag');
SET @tag_id = LAST_INSERT_ID();
INSERT INTO g5_tag_write (wr_id,tag_id) VALUES(@wr_id, @tag_id);
SET @wr_id = 2;
INSERT IGNORE INTO g5_tag (name, bo_table)VALUES ('서버', 'tag');
SET @tag_id = LAST_INSERT_ID();
INSERT INTO g5_tag_write (wr_id,tag_id) VALUES(@wr_id, @tag_id);
INSERT IGNORE INTO g5_tag (name, bo_table) VALUES ('웹패널', 'tag');
SET @tag_id = LAST_INSERT_ID();
INSERT INTO g5_tag_write (wr_id,tag_id) VALUES(@wr_id, @tag_id);
INSERT IGNORE INTO g5_tag (name, bo_table) VALUES ('태그', 'tag');
SET @tag_id = LAST_INSERT_ID();
INSERT INTO g5_tag_write (wr_id,tag_id) VALUES(@wr_id, @tag_id);
SET @wr_id = 3;
INSERT IGNORE INTO g5_tag (name, bo_table)VALUES ('태그테스트', 'tag');
SET @tag_id = LAST_INSERT_ID();
INSERT INTO g5_tag_write (wr_id,tag_id) VALUES(@wr_id, @tag_id);
INSERT IGNORE INTO g5_tag (name, bo_table) VALUES ('서버', 'tag');
SET @tag_id = LAST_INSERT_ID();
INSERT INTO g5_tag_write (wr_id,tag_id) VALUES(@wr_id, @tag_id);
INSERT IGNORE INTO g5_tag (name, bo_table) VALUES ('아파치', 'tag');
SET @tag_id = LAST_INSERT_ID();
INSERT INTO g5_tag_write (wr_id,tag_id) VALUES(@wr_id, @tag_id);
g5_tag에 mb_id는 필요 없애고, name과 bo_table만 같으면 중복 체크로..
중복체크를 위해서 SQL은
SELECT COUNT(1) FROM g5_tag WHERE name = "태그" and bo_table="tag";
// 같은 게시판에 같은 태그가 있는지 체크, 있다면 tag_id값이
$sql_table = "SELECT id FROM $tag_table WHERE name = '$tags' and bo_table = '$bo_table'";
$id = sql_query( $sql_table , false );
if($id) {
// $id 갑이 있다면 그 아이디 값고 글과의 관계만 설정해 줌.
$sql_table = "INSERT INTO g5_tag_write (wr_id, tag_id) VALUES($wr_id, $id);";
} else {
// $id값이 없으면 태그와 게시판을 써주고, 관계 테이블에 설정을 함.
$sql_table = "INSERT IGNORE INTO g5_tag (name, bo_table) VALUES ('$tags', '$bo_table');
SET @tag_id = LAST_INSERT_ID();
INSERT INTO g5_tag_write (wr_id, tag_id) VALUES($wr_id, @tag_id);";
};
0
댓글 0개