문제

간단한 정규화 된 데이터베이스가있는 웹 사이트에서 작업 중입니다.

페이지라는 테이블과보기라는 테이블이 있습니다. 페이지가 볼 때마다 해당보기의 고유 한 레코드가 Views 테이블에 기록됩니다.

사이트에 페이지를 표시 할 때 간단한 MySQL Count ()를 사용하여 디스플레이 뷰 수를 총을 올렸습니다.

이 문제를 제외하고는 데이터베이스 디자인이 괜찮은 것 같습니다. 저는 수천 명의 가장 많이 본 10 개의 페이지를 검색하는 방법을 잃어 버렸습니다.

각 페이지의 총 뷰 수를 유지하려면 페이지를 추가하여 페이지 테이블을 설명해야합니까? 아니면 가장 많이 본 10 개의 페이지를 쿼리하는 효율적인 방법이 있습니까?

도움이 되었습니까?

해결책

   SELECT p.pageid, count(*) as viewcount FROM 
   pages p
   inner join views v on p.pageid = v.pageid
   group by p.pageid
   order by count(*) desc   
   LIMIT 10 OFFSET 0;

나는 이것을 테스트 할 수 없지만 그 선을 따라 무언가를 테스트 할 수 없다. 성능 제약으로 인해 값을 저장하지 않을 것입니다 (방금 "조기 최적화"라는 용어를 배웠으며, 그렇다면 적용되는 것 같습니다).

다른 팁

유지하려는 정보 수준에 따라 다릅니다. 누가 언제 본 사람을 녹음하고 싶다면? 그런 다음 별도의 테이블이 괜찮습니다. 그렇지 않으면보기의 열이 갈 길입니다. 또한 별도의 열을 유지하면 각 페이지보기가 해당 행의 열을 업데이트하려고하므로 테이블이 더 자주 잠겨 있음을 알 수 있습니다.

Select pageid, Count(*) as countCol from Views
group by pageid order by countCol DESC
LIMIT 10 OFFSET 0;

아마도 페이지 테이블에보기 열을 포함시킬 것입니다.

그것은 나에게 정규화의 완벽하게 합리적인 파괴처럼 보인다. 특히 나는 당신이 뷰를 삭제하는 것을 상상할 수 없기 때문에, 당신은 수가 쫓겨날 것으로 기대하지 않을 것입니다. 이 경우 참조 무결성은 매우 중요하지 않은 것처럼 보이지 않습니다.

데이터베이스 정규화는 데이터를 저장하는 가장 효율적 / 최소 중복 방법에 관한 것입니다. 이는 거래 처리에 적합하지만 종종 데이터를 효율적으로 가져와야 할 필요성과 직접 충돌합니다. 문제는 일반적으로보다 액세스 가능한 사전 처리 된 데이터를 사용하여 파생 테이블 (인덱스, 구체화 된 뷰, 롤업 테이블 ...)을 사용하여 해결됩니다. 여기에 약간 날짜가 작은 유행어는 데이터웨어 하우징입니다.

나는 당신이 당신의 페이지 테이블을 정규화하고 싶다고 생각하지만 총계가있는 추가 테이블이 있다고 생각합니다. 최근의 수가 필요한 방법에 따라 원래 테이블을 업데이트 할 때 테이블을 업데이트하거나 총계를 정기적으로 재 계산할 수있는 배경 작업을 할 수 있습니다.

또한 실제로 성능 문제를 해결하는 경우에만이 작업을 수행하고 싶습니다. 매우 많은 레코드가 없거나 동시 액세스가 매우 많지 않으면 안됩니다. 코드를 유연하게 유지하여 테이블을 사용하지 않고 가지고 있지 않은 것 사이를 전환 할 수 있습니다.

이 경우 분명히 비정규 화가 작동합니다. 손실은 여분의 칼럼에서 사용한 여분의 저장실입니다.

또는 트래픽이 낮을 때마다 X 기간이 적을 때 마다이 정보를 야간으로 채우기 위해 예정된 작업을 설정할 수 있습니다.

이 경우이 쿼리를 수동으로 실행하지 않으면 페이지 수를 즉시 알 수있는 능력을 잃게됩니다.

성능을 높이기 위해 분명히 사용될 수 있습니다.

-Kris

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top