해시태그 구현하기

juna·2020년 1월 3일
28

구현하기

목록 보기
1/2

해시태그를 구현하는 2가지 방법에 대해서 소개하고자 합니다.

간단한 방법

기본.PNG

문자열 hashtag 필드를 사용할경우 간단한 추가/수정이 가능합니다

INSERT INTO post (title, content, hashtag) 
VALUES ('제목', '내용', '#강아지#고양이');
UPDATE post SET title = '제목', content = '수정 내용', hashtag = '#멍멍이#고양이' 
WHERE (post_id = 1);

다만 단점은 해시태그 조회가 어렵습니다

  1. 현재 게시글에서 사용중인 해시태그 파악 어렵습니다
    • 요번주 트렌드 해시태그 목록
    • 등록된 모든 해시태그
  2. 특정 해시태그를 통해 글을 찾기 어렵습니다.
    • #강아지 를 사용하는 글 조회

해시태그와 글을 분리하는 방법

분리.PNG

위 구조의 장점은 앞서 소개했던 문자열 필드의 단점을 해결할 수 있습니다.
즉 더 많은 기능 구현이 가능합니다
다만 생성,수정,삭제와(태그와 게시글 사이의 관계 관리) 조회가 보다 복잡해집니다

INSERT/UPDATE/DELETE

  1. 트랜잭션을 이용해야합니다.
  2. 만약 글에 등록하고자 하는 태그가 없다면 tag 테이블에 먼저 추가해야합니다
  3. post에 글을 추가/수정합니다.
    • INSERT한 글 PK를 구합니다
  4. post_id를 통해 post_tag 테이블에 해시태그들을 추가합니다
  5. 커밋

다만 글과 해시태그를 수정할때
사용하고 있는 해시태그들과 새로 추가,삭제된 해시태그를 잘 살펴주시기 바랍니다

글을 삭제할때
post_tag 테이블에 post 테이블과의 관계 설정시 ON DELETE CASCADE 를 사용하시면 됩니다
다만 누구도 참조하지 않는 태그는 삭제하시고 싶으시다면 먼저 체크를 해야합니다

SELECT

등록된 해시태그를 원한다면 tag 테이블을 조회하면 됩니다

IDNAME
1강아지
2고양이
3

다만 트렌드 해시태그기능을 구현하고자한다면 post_tag에 생성일(태그-글 연결일)을 추가해야합니다

특정 해시태그를 통해 글을 찾는다면

SELECT post.* 
FROM post_tag
JOIN post ON post.post_id = post_tag.post_id
WHERE post_tag.tag_id = 1

위 쿼리는 #강아지 를 사용하는 글을 조회하는 방법입니다.

저는 tag_id 를 사용했지만 tag 테이블에서 문자열을 통해 원하는 태그를 찾고
post_tagpostJOIN하는 방법도 사용해보세요

여러 해시태그를 통해 글을 찾는다면 해시태그 다중 검색이라고 하나요?

예를들어서 #강아지#고양이 이라고 검색창에 입력한다면

강아지와 고양이 태그를 모두 등록한 게시글만 검색되어야 합니다.

방법은 아래와 같습니다

SELECT post.* 
FROM post_tag
JOIN post ON post.post_id = post_tag.post_id
WHERE post_tag.tag_id IN (1,2)
GROUP BY post_tag.post_id
HAVING (COUNT(post_tag.tag_id) = 2);

만약 게시판 페이지네이션 기능을 위해

글 조회시 limit(MySQL) 을 사용하셨다면
limit을 사용하지 않은, 전체 글의 개수를 구해야합니다
아래와 같은 방법으로 전체 글 개수를 구할 수 있습니다

SELECT COUNT(*)
FROM (SELECT post.post_id 
    FROM post_tag 
    INNER JOIN post ON (post.post_id = post_tag.post_id)
    WHERE (post_tag.tag_id IN (1, 2))
    GROUP BY post_tag.post_id 
    HAVING (COUNT(post_tag.tag_id) = 2))
profile
웹 개발자

2개의 댓글

comment-user-thumbnail
2023년 1월 17일

tag 테이블과 post 테이블을 바로 연결시키면 안되나요? post_tag 테이블을 따로 빼는 이유가 있는지 궁금합니다.

1개의 답글