해시태그를 구현하는 2가지 방법에 대해서 소개하고자 합니다.
문자열 hashtag 필드를 사용할경우 간단한 추가/수정이 가능합니다
INSERT INTO post (title, content, hashtag)
VALUES ('제목', '내용', '#강아지#고양이');
UPDATE post SET title = '제목', content = '수정 내용', hashtag = '#멍멍이#고양이'
WHERE (post_id = 1);
다만 단점은 해시태그 조회가 어렵습니다
#강아지
를 사용하는 글 조회위 구조의 장점은 앞서 소개했던 문자열 필드의 단점을 해결할 수 있습니다.
즉 더 많은 기능 구현이 가능합니다
다만 생성,수정,삭제와(태그와 게시글 사이의 관계 관리) 조회가 보다 복잡해집니다
트랜잭션
을 이용해야합니다.post
에 글을 추가/수정합니다.INSERT
한 글 PK를 구합니다post_id
를 통해 post_tag
테이블에 해시태그들을 추가합니다다만 글과 해시태그를 수정할때는
사용하고 있는 해시태그들과 새로 추가,삭제된 해시태그를 잘 살펴주시기 바랍니다
글을 삭제할때는
post_tag
테이블에 post
테이블과의 관계 설정시 ON DELETE CASCADE
를 사용하시면 됩니다
다만 누구도 참조하지 않는 태그는 삭제하시고 싶으시다면 먼저 체크를 해야합니다
등록된 해시태그를 원한다면 tag
테이블을 조회하면 됩니다
ID | NAME |
---|---|
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_tag
와 post
를 JOIN
하는 방법도 사용해보세요
여러 해시태그를 통해 글을 찾는다면 해시태그 다중 검색이라고 하나요?
예를들어서 #강아지#고양이 이라고 검색창에 입력한다면
강아지와 고양이 태그를 모두 등록한 게시글만 검색되어야 합니다.
방법은 아래와 같습니다
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))
tag 테이블과 post 테이블을 바로 연결시키면 안되나요? post_tag 테이블을 따로 빼는 이유가 있는지 궁금합니다.