2013-03-12 5 views
0

articles, journalssubscribers의 세 엔티티가 있습니다. 데이터베이스에 데이터를 저장하는 방법에는 제한이 없습니다. 동일한 기사를 여러 저널에 동시에 게시 할 수 있습니다.반복없이 데이터를 쿼리하고 시간을 최소화하는 방법은 무엇입니까?

등록 된 저널의 모든 게시 된 기사를 선택하는 방법 을 발행일 및 반복순으로 정렬합니까?

가장 쉬운 방법 : 이 p_id, j1_id는, j2_id, text, date

  • 가 subscribtions있는 테이블을 작성 게시물 :

    1. 기사와 테이블을 작성 다음은입니다.

    예를 들어 쿼리 중복과

    select posts.* from posts inner join follows on (j_id = j1_id or j_id 
    = j2_id) where u_id = 1 order by date desc 
    

    이 쿼리 데이터를 반환 : -f_id, u_idj_id

  • 이 실행 (u_id는 테이블에서 사용자 사용자 ID입니다). 메커니즘 DISTINCT 또는 GROUP BY을 사용할 수 있지만 중복을 제거하기 위해 추가 정렬 작업을 만듭니다.

    UNION 메커니즘을 사용하여 다른 방법으로 수행 할 수 있지만 DISTINCT도 사용합니다.

    (select posts.* from posts inner join follows on j_id = j1_id where u_id = 1) 
    union 
    (select posts.* from posts inner join follows on j_id = j2_id where u_id = 1) 
    order by date desc 
    

    아마도 잘못된 방식으로 저장 방법을 선택했습니다.

    실제로 큰 데이터에 필요한 시간을 최소화하기 위해이 문제에 대해 뭔가를 할 수 있습니까? PID, 텍스트, 날짜 저널 :

  • +1

    샘플 레코드를 게시 할 수 있습니까? –

    +0

    샘플 데이터가 없습니다. 죄송합니다. –

    +0

    테이블의 크기는 얼마나됩니까? –

    답변

    0

    다음과 같은 테이블 구조

    게시물 사용할 수 있습니다 JID를 journals_posts을 jtext : JID 을 PID 다음과 FID, UID, JID

    select distinct posts.* from posts 
    inner join journals_posts on journals_posts.pid = posts.pid 
    inner join follows on follows.jid = journals_posts.jid 
    where follows.uid = <userid> 
    

    에 속도를 돌보면 인덱스를 만들 수 있습니다. journals_posts (jid) 다음 (uid)

    다른 인덱스를 만들 필요가 있습니다. 필드가 조인을 사용하지 않고 스캔되는 "설명"으로 확인하십시오.

    +0

    이 구조와 쿼리는 훌륭하고 고전적입니다. 매우 큰 데이터를 저장하고 쿼리 할 수있는 최적의 방법이 있습니까? 여기를 읽으면서 http://webbtechsolutions.com/2009/07/24/the-effects-of-distinct-in-a-sql-query/ DISTINCT를 사용하면 쿼리가 느려집니다. –

    관련 문제