문제

이것은 털이 많은 질문 일 수 있지만. 내가 가지고 있다고 말해

Followers:
-user_id
-follower_id

Activities:
-id
-user_id
-activity_type
-node_id

사용자 활동을 당기는 것은 매우 쉽습니다. 그러나 추종자 활동을 얻는 가장 좋은 방법은 무엇입니까? 하위 선택? 사용자가 점점 더 많은 추종자를 얻을 수있게되면 매우 느린 것 같습니다. 이것을 속이는 아이디어가 있습니까?

또한 더 개념적 수준에서. 그룹화는 어떻게 작동합니까? 모두 단일 쿼리로 완료됩니까? 아니면 모든 활동 데이터가 PHP 측면에서 정렬 및 그룹화되어 있습니까?

사용자 X, Y 및 Z는 활동을 수행했습니다.

도움이 되었습니까?

해결책

하위 선택 사항은 종종 조인보다 느리지 만 실제로는 정확히 무엇을하고 있는지에 달려 있습니다. 주요 질문에 답하기 위해, 나는 가입과 함께 추종자 데이터를 얻을 것입니다.

SELECT * FROM followers f
LEFT JOIN activities a ON f.follower_id=a.user_id
WHERE f.user_id=$followedPerson

추종자 테이블이 사용자를 대표한다고 가정합니다. user_id, 그리고 그들과 함께 그들을 따르는 사람 follower_id 그것은 a user_id 사용자 테이블에서도.

결코 그렇지 않을 것입니다 놀랍도록 색인이있는 한 느리게 followers.user_id. 그러나 이러한 쿼리가 반환 될 수있는 데이터의 양은 실제로 처리하고자하는 것보다 커질 수 있습니다. 애플리케이션이 표시하려는 활동의 종류를 결정하고 항상 거대한 쿼리를 만들지 않고 반환 된 결과의 작은 부분 만 사용하도록 필터링해야합니다.

데이터를 꺼내고 그룹화하는 것은 괜찮지 만 처음에는 선택을 피할 수 있다면 더 좋습니다. 이 경우 아마도 추가 할 것입니다 ORDER BY f.follower_id,activity_date DESC, 날짜가 존재한다고 가정하고 활동 테이블에 대한 더 많은 필터링 기준을 제시하십시오. 그런 다음 Follower가 그룹화 한 데이터를 출력하여 PHP의 행을 반복합니다.

다른 팁

활동 로그는 일반적으로 현재 사용자의 활동과 모든 친구가 혼합되어 있기 때문에 매우 많은 수의 레코드의 잠재력을 가지고 있습니다. 다양한 테이블에 가입하고있는 경우 사용자에게는 100 명의 친구가있는 경우 잠재적으로 많은 데이터를 꺼낼 수 있습니다.

한 가지 방법은 데이터를 비정규 화하고 사용자의 활동 로그 페이지에 나타나야하는 모든 항목이 해당 사용자에 대한 활동 로그 테이블에 저장 될 수있는 하나의 큰 로그로 취급하는 것입니다. 예를 들어, 사용자 A가 사용자 B와 사용자 C의 두 친구가있는 경우, 사용자 A가 세 가지 활동 로그 레코드를 작성하는 경우 다음을 수행합니다.

record 1: "I did this" log for user A
record 2: "My friend did this" log for user B
record 3: "My friend did this" log for user C

중복을 얻을 수 있지만 실제로는 중요하지 않습니다. 하나의 테이블에서 사용하고 사용자 ID에서 색인화되었으므로 선택하는 것이 빠릅니다. 그리고 활동 로그 테이블 (예 : 1 개월 이상 항목 삭제)을 집에서 키우실 것입니다.

활동 로그 테이블은 다음과 같습니다.

-id
-user_id  (user who's activity log this is)
-action_user_id  (user who took the action, or null if same as user_id)
-activity_type
-date

단일 사용자에 대한 모든 최근 활동 로그를 선택하려면 쉽습니다.

SELECT * from activity_log WHERE user_id = ? ORDER by date DESC LIMIT 0,50

이 접근법을 실제로 효율적으로 만들려면 단일 활동 로그 테이블에 더 이상 선택할 필요가 없도록 충분한 정보가 있어야합니다. 예를 들어, 원시 로그 메시지를 즉시 구축하지 않고 저장할 수 있습니다.

나는 당신이 필요한 것을 올바르게 이해했는지 모르겠지만,이 선택을 시도 할 것입니다. 내가 옳다면 모든 추종자들에게 모든 활동을 받아야합니다. #USERID#

SELECT a.* FROM Activities AS a 
INNER JOIN Followers AS f1 
ON a.user_id = f1.follower_id
WHERE f1.user_id = #USERID# 
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top