안녕하세요. 게시판 프로젝트를 진행하다가 해시태그 기능을 도입하는데 테이블 설계를 어떤 방식으로 해야할지 고민이 생겨 질문드립니다.
테이블은 User(사용자), Post(게시글)이 있을 때 게시글에 해시태그를 0~N개 지정할 수 있습니다.
그리고 해시태그로 검색 시 관련된 게시글 목록을 조회할 수 있습니다.
첫 번째 방법입니다.
Post 테이블
id (PK) | title | content | user_id (FK) |
id (int) | 제목 (varchar) | 내용 (varchar) | 작성자 id (int) |
Hashtag 테이블
id (PK) | name | post_id (FK) |
id (int) | 태그_내용 (varchar) | 게시글 id (int) |
위와 같이 Post 테이블과 Hashtag 테이블을 구성합니다. Post 테이블과 Hashtag 테이블을 일대다 관계로 구성합니다.
이 방법은 서로 다른 게시글에서 동일 해시태그를 저장했을 때 문자열이 중복됩니다.
두 번째 방법입니다.
Post 테이블
id (PK) | title | content | user_id (FK) |
id (int) | 제목 (varchar) | 내용 (varchar) | 작성자 id (int) |
Hashtag 테이블
id (PK) | name |
id (int) | 태그_내용 (varchar) |
PostHashtag 테이블
post_id (PK,FK) | hashtag_id (PK,FK) |
게시글 id (int) | 해시태그 id (int) |
이 방법은 Hashtag 테이블에 중복되지 않은 고유한 해시태그들을 저장하고 Post 테이블과 Hashtag 테이블을 다대다 관계로 구성한 방식입니다.
첫 번째 방법은 해시태그로 게시글을 검색할 때 찾으려는 모든 데이터를 문자열로 검색해야 하고,
두 번째 방법은 Hashtag 테이블에서 검색하려는 해시태그의 id를 찾을 때만 문자열로 검색하고 이후에는 해당id로(int형으로) PostHashtag 테이블에서 검색해야 한다고 생각합니다.
두 방법 중 어떤 방법이 검색할 때 더 효율적인지 궁금합니다. 또는 새로운 기능이 추가됐을 때 확장성까지 고려한다면 두 번째 방법이 더 좋은 것 같기도 하지만 불필요하게 테이블을 나눈 것 같다는 생각도 듭니다.
문제를 해결하기 위해 관련 키워드나 추천하시는 방법이 있다면 조언 부탁드립니다. 감사합니다.