안녕하세요. 게시판 프로젝트를 진행하다가 해시태그 기능을 도입하는데 테이블 설계를 어떤 방식으로 해야할지 고민이 생겨 질문드립니다.
테이블은 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 테이블에서 검색해야 한다고 생각합니다.
두 방법 중 어떤 방법이 검색할 때 더 효율적인지 궁금합니다. 또는 새로운 기능이 추가됐을 때 확장성까지 고려한다면 두 번째 방법이 더 좋은 것 같기도 하지만 불필요하게 테이블을 나눈 것 같다는 생각도 듭니다.
문제를 해결하기 위해 관련 키워드나 추천하시는 방법이 있다면 조언 부탁드립니다. 감사합니다.
설계는 명확한 답이 없어서 말씀하신 대로 설계 방향에 따라 장단점이 있지요. 해시태그를 단순히 게시글 검색용으로만 사용할 것이냐 혹은 해시태그 자체에 어떤 의미를 둘 것이냐(해시태그만으로 리스트를 나열하여 사용자에게 보여준다든지..) 에 따라 설계 방향이 달라질 것 같네요. 작성하신 글에서 이미 많은 고민을 하신 것 같은데 앞으로 해시 태그를 어떤 방향으로 사용할지 고민하시면 답이 나올 것 같습니다.
답변 감사드립니다! 덕분에 고민이 해결됐습니다!