그누보드 태그 지원 > 그누5튜닝

그누5튜닝

그누보드 태그 지원 정보

그누보드 태그 지원

본문

태그 관련을 공부중입니다.

 

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:

g3.PNG

태그 테이블과 게시판 테이블을 연결해주는 중간 테이블 (가칭 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: 만들어진 시간 (중복?)

g4.PNG

태그를 읽어 온다고 하면 (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'

g5.PNG

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'

g6.PNG

중간테이블에 여러 데이타를 넣은 이유는 아마도 읽어 올때 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;

g1.PNG

중간 테이블은 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;

g2.PNG

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개

전체 64 |RSS
그누5튜닝 내용 검색

회원로그인

진행중 포인트경매

  1. 참여3 회 시작24.04.25 20:23 종료24.05.02 20:23
(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT