Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

wintertreey 님의 블로그

[DB] like 기능구현에 대한 칼럼/테이블 고민 본문

팀 프로젝트

[DB] like 기능구현에 대한 칼럼/테이블 고민

wintertreey 2024. 8. 11. 20:22

고민하며 그린 그림

 

place table과 user table에 대해 칼럼을 짜던 중 고민거리가 생겼다. 

좋아요 like에 대해서 보여주기 위해, 어느 테이블에 어떤 칼럼이 필요할까??

 

우선 내가 구현하고자 하는 기능은 다음과 같다.

 

1. 사용자가 좋아요한 장소 조회(마이페이지)

2. 장소별 좋아요 수(장소 상세페이지)

 

 

1. 사용자가 좋아요 한 장소 조회

place 테이블에  p_like boolean으로 가능.

p_like 칼럼의 값이 true일 때 해당 장소가 찜된 것으로 간주되므로, 
별도의 칼럼 없이도 원하는 기능을 구현할 수 있습니다.

 

 

2. 장소별 좋아요 수

place 테이블에 like_cnt 칼럼이 필요했다. 

user 테이블이 아닌 place 테이블에 해당 칼럼을 둠으로써, 

효율성, 데이터 집계, 데이터 유지와 업데이트적인 측면에서 더 합리적이었다.

 

효율성: 장소 테이블에 p_like_cnt 칼럼을 두면, 
각 장소에 대한 찜 수를 빠르게 조회할 수 있습니다. 
이 방식은 조회 성능이 높고, 
추가적인 JOIN 연산 없이도 직접적으로 찜 수를 알 수 있습니다.

데이터 집계: 찜 수를 집계하려면 사용자가 찜한 정보를 저장하는 별도의 테이블(user_likes)이 필요합니다. 
user_likes 테이블에서 장소별 찜 수를 집계하여 p_like_cnt 칼럼을 업데이트하면 됩니다. 
이 방식은 정규화된 데이터 구조를 유지하면서도 필요한 집계 정보를 제공합니다.

데이터 유지와 업데이트: user_likes 테이블을 사용하여 
장소 테이블의 p_like_cnt 칼럼을 주기적으로 업데이트하는 방법을 사용할 수 있습니다. 
이렇게 하면 장소 테이블에 직접 찜 수를 저장하고, 
이를 기반으로 통계 정보를 제공할 수 있습니다.

 

 

- 고민1

사용자 테이블에 p_like 칼럼 vs 별도의 like 테이블

: 사용자테이블에 p_like 칼럼 비효율적. 
사용자 ID별로 좋아요한 장소 no를 쉼표로 구분하여 저장.
좋아요 데이터를 관리하는 데 어려움을 줄 수 있습니다. 
일반적으로 별도의 테이블을 사용하는 것이 더 적합.

 

 

- 고민2

장소에서 뿐만 아니라 리뷰 테이블, 보드 테이블 에서도 like 기능 구현이 필요하다는것을 알게되었다. 

이를 위해 각 테이블에 like boolean과 like_cnt int 칼럼을 넣어주고, 

모든걸 한데 모은 like 테이블을 만들기로 했다. 

 

해당 like가 장소인지, 리뷰인지, 보드인지 구분하기위해 다음과 같은 조치를 취했다.

table likes{

 likes_no int pk

 user_id varchar(10)

 target_no int        // 리뷰, 보드, 장소의 no

 target_type varchar(10) //  리뷰인지, 보드인지, 장소인지. 

}

 

 

통합된 likes 테이블을 만드는것의 장단점은 분명히 있지만,

정규화를 위해 하나의 likes 테이블만을 만드는 선택을 하기로 했다.


장점:
좋아요 관련 데이터를 하나의 테이블에서 관리할 수 있어 데이터베이스 구조가 단순화됩니다.
장소와 리뷰의 좋아요를 쉽게 통합 관리할 수 있습니다.

단점:
target_type과 target_id를 조합하여 외래 키를 동적으로 참조해야 하므로, 
무결성 제약을 유지하기 어려울 수 있습니다.
좋아요를 집계할 때 target_type을 체크해야 하므로 쿼리가 복잡해질 수 있습니다.

 

'팀 프로젝트' 카테고리의 다른 글

[API] openWeatherMAP을 통해 주간날씨 구현하기  (0) 2024.08.16
[DB] DB 정규화  (0) 2024.08.16
[설계] RESTful 하게 API 짜기  (0) 2024.08.15