현재 회원으로 활동중인 사이트에서 다른 회원들을 좋아할 수 있습니다. 그런 다음 회원이 즐겨 찾기 페이지로 이동하면 시간이 지남에 따라 즐겨 사용하는 모든 회원을 볼 수 있습니다.데이터베이스를 비정규 화하여이 특별한 방법으로 성능을 향상시킬 수 있습니까?
나는 2 가지 방법으로 이것에 대해 갈 수:
방법 # 1 : 사용자의 즐겨 찾기 내가 (인덱스가 user_favoriting_id
입니다 같이 보이는 favorites
테이블에서 행을 입력 다른
때마다) :
id | user_favorited_id | user_favoriting_id
-------------------------------------------
그들은 "즐겨 찾기"페이지를로드 할 때 다음, 나는 user_favoriting_id 값이 presen의 그것과 동일 위치를 즐겨 찾기 테이블에 선택이 모든 행을 찾기 위해 할 로그인 한 사용자. 그런 다음 user_favorited_ids를 사용하여 단일 SELECT 문을 작성하고 별도의 사용자 테이블에서 해당 사용자를 조회합니다.
방법 # 2 :
때마다 사용자의 즐겨 찾기 다른 나는 이런 식으로 뭔가를 보이는 사용자 테이블에서 자신의 행에 즐겨 찾기 필드를 업데이트합니다 (자세한 필드이기는하지만, 인덱스 ID입니다) :이 항목은 다음처럼 쉼표로 구분 된 문자열을 보유 할 수 있도록 I는 사용자의 ID를 CONCAT 것이다
id | username | password | email | account_status | timestamp | favorites
--------------------------------------------------------------------------
는
favorites
필드 즐겨 찾기되고 :
10,44,67
등 ...
그런 다음 방법 # 1과 같은 즐겨 찾기 페이지를 만들려면 즐겨 찾는 모든 사용자를 한 번만 선택하면됩니다. 그 부분은 동일합니다.
나는 방법 # 1이 그것을하는 정규화 된 방법다는 것을 알고 매우 더 귀엽다. 그러나이 특정 프로젝트에 대한 저의 관심은 무엇보다도 확장 성과 성능입니다.
내가 방법 # 2를 선택하는 경우, 사용자 테이블에 사용자가 로그인하는 즉시 어쨌든 선택해야하므로, 별도의 즐겨 찾기 테이블에 조회하는 것을 줄일 수 있습니다.
을 그리고 난 꽤 확실한 방법 # 2에서 그 CSV 값을 나누기 위해 PHP의 폭발 함수를 사용하여 favorites
테이블에 대한 방법 # 1의 추가 db look up과 거의 같은 시간이 걸릴 것이 아니라, 단지 물어 봐야 할 경우를 대비하여 묻습니다 :
From 순전히 성능 관점, 이러한 방법 중 더 최적화 된?
또한이 웹 사이트에 하루에 수조의 페이지 뷰가 제공됩니다.
방법 2에서 조회하는 작업이 매우 느릴 것입니다 (각 ID를 분석하여 개별적으로 찾아야 함) 평범한 조인을하지 않기 때문에 모든 종류의보고가 빠져 나올 것입니다. ID 만 표시하고 즐겨 찾기에 대한 의미있는 설명은 표시하지 않으시겠습니까? –
@Robert와 동의; 하지만 누가 나를 호감가는 지보기 어려워진다. – pilotcam
@Robert Harvey 실제로'WHERE id = $ split_value'와 같은 문자열을 작성하고 foreach 루프 안에 배치하여 분해 된 CSV 배열을 실행하고 있습니다. 그런 식으로 내가 어쨌든 빌드하려고했던 SELECT SQL 끝에이 추가 할 수 있습니다. 이렇게하면 SQL은 PHP에서 빌드되고 실행되기 전에 하나의 쿼리가됩니다. – TK123