2013-04-19 3 views
1

비슷한 시스템을 만들어야합니다 (이름은 "좋아"하지 않을 것이며, Facebook은 소유하고 있습니다). 그래서 나는 데이터베이스에 이러한 좋아하는 것을 저장하는 두 가지 방법을 상상했고, 트래픽이 많은 사이트의 경우 더 좋은 방법을 알고 싶습니다.Mysql은 "Facebook likes"와 같은 것을 저장합니다.

  1. "id", "comment_id", "user_id"셀을 사용하여 comment_likes 테이블을 만듭니다. 코멘트 테이블에 "like_count"를 저장합니다. 그래서 그것을 쓸 필요가있을 때 계산할 필요가 없습니다. 그러나 좋아하는 일은 쉽기 때문에 사람들은 많이 만들 것이고, 내가 지정한 댓글의 좋아하는 것을 나열해야한다면 전체 comment_likes 테이블을 읽고 모든 user_ids를 찾아야합니다. 앞으로 수백만 행이 될 수 있습니다. 1000 명의 사용자가 같은 시간에 그것을 할 경우, 내 시스템이 죽을 것이다.
  2. 두 번째 생각은 댓글 테이블에 좋아요를 저장하는 것입니다. 1 # 34 # 21 # 56 # .... 누군가가 댓글을 달거나 좋아하지 않을 때이 셀에 자신의 ID를 # CONCAT 또는 REPLACE 할 때 # . 지정된 주석을 나열해야 할 때이 목록을 # -s에서 분해하십시오.

제 생각에는 2 차가 더 빠르고 똑똑 할 수 있다고 생각하지만이 점에 대해 어떻게 생각합니까?

+1

두 번째 방법은 문제가됩니다. 생성 한 열이 너무 작아 모든 데이터를 저장할 수 없다면 어떻게해야합니까? 또한 LIKE를 사용한 쿼리 만 사용하여 검색 할 수 있습니다. 즉, 인덱싱이 작동하지 않으므로 속도가 느려집니다. 첫 번째 옵션은 더 많은 행을 생성하지만 인덱싱을 사용하면 훨씬 빨라집니다. – andrewsi

답변

1

첫 번째 옵션은 관계형 설정의 장점이 있으므로 훨씬 더 좋습니다. 예를 들면 : 당신이 원하는 데이터베이스 userId x에서 코멘트를 얻고 싶다면? 첫 번째 설정으로 빠르고 간단한 쿼리입니다. 두 번째 경우에는 훨씬 더 느리고 부정확 한 LIKE를 사용해야합니다. (userId가 1이고 주석 테이블의 likes 필드에 # 10이 있다고 가정하면 LIKE '% 1 %'을 (를) 사용하면 주석이 반환됩니다.

트래픽이 많은 사이트의 경우에도. commentId에 인덱스를 사용하면이 작업을 빠르게 수행 할 수 있습니다.

첫 번째 옵션으로 이동하십시오.

첫 번째 옵션의 속도를 정말로 의심하는 경우 좋아요 수를 계산하는 댓글 테이블에 '캐시'입력란을 만들 수 있으므로 좋아요를 선택하기 위해 하위 쿼리를 수행 할 필요가 없습니다 카운트.

+0

고마워, 네가 말한대로 해줄거야. –