2012-01-14 4 views
3

이것은 꽤 오랫동안 궁금해했던 질문입니다. 나는 예제를 통해 설명하려고 노력할 것이다. 그러나 그것은 일반적인 질문이다. 필드 등을 가진 사용자에 의해 작성된 게시물을 보유하고있는 사용자의 ...SQL 쿼리 - 결과 집합에서 이중 데이터를 피하려고합니까?

  1. 사용자의 이름을 보유, 성,
  2. 게시물 :

    는 두 개의 테이블을 말해봐 제목, 텍스트 등 ...

이제 지난 24 시간 내에 생성 된 모든 게시물을 표시하려고한다고 가정합니다. 이 표에서이 게시물을 작성한 사용자의 이름, 성 등을 표시하려고합니다. 내 질문에,

이제 게시물, 사용자 posts.user_id = users.id를 AND [지난 24 시간] FROM ...

SELECT : 쿼리는 아마 같을 것입니다. 한 사용자가 지난 24 시간 내에 여러 게시물을 작성했을 가능성이 매우 높기 때문에 기본적으로 이름, 성을 검색하고 있습니다. 즉, 위 쿼리의 결과 집합에는 중복 데이터가 포함되지만 중복 행은 포함되지 않습니다.

아닌가요 그것은 더 나은 : 게시물 FROM ...

  1. SELECT WHERE [지난 24 시간] IN ID가 (마지막 게시물 WHERE [구별 USER_ID를 선택 사용자의
  2. SELECT ... 24 시간]
  3. 응용 프로그램 수준 또는 SQL 프로 시저에서 두 번째 쿼리의 결과와 첫 번째 쿼리 결과를 매핑하여 이름, 성 등을 찾습니다.이 경우 게시물의 성, 이름 등을 쉽게 찾을 수 있습니다. 식별자 (기본 키)는 일종의 해시 맵, 배열 또는 이와 유사한 인덱스/키입니다.

?

본인은 이것이 매우 일반적인 질문이라고 생각하지만 통찰력을 환영합니다. 감사!

+0

컨텍스트에서 더 좋은 것은 무엇입니까? – EvilTeach

답변

2

어느 방법을 작동해야하지만 당신은 중요한 부분에 명중 :

응용 프로그램 수준에서 작업을 수행합니다.

내 결과 집합의 각 행에 필요한 모든 데이터가 포함되도록 중복 데이터를 가져옵니다. SQL은 거의 모든 선언적 언어보다 JOIN 및 집합 연산에서 더 효율적입니다.

데이터를 함께 보관하면 필요한 경우 다운 스트림으로 쉽게 분할 할 수 있으며 두 개가 아닌 한 번만 데이터베이스를 호출하면됩니다.

중복 된 데이터가 증가함에 따라 이러한 이점이 줄어 듭니다. 단지 몇 개의 필드 일 경우 큰 영향을주지 않습니다. 수십 개의 중복 데이터 필드가 있다면 성능 차이가 훨씬 더 두드러 질 것입니다.

특정 예를 들어, 단일 쿼리에서 모든 것을 수행하는 것이 훨씬 더 좋습니다.

귀찮은 경우 응용 프로그램 수준에서 중복을 제거 할 수 있지만 동일한 사용자에 대해 여러 번 반환되는 두 개 또는 세 개의 추가 필드는 여러 데이터베이스 호출과 비교할 때 그리 중요하지 않습니다.

+0

+1, "단일 쿼리를 더 잘" –

0

나는 최상의 솔루션이 사용자를 선택하고, 어리 석음은 지난 24 시간 동안 메시지를 가지고 있으며 사용자 ID별로 메시지를 선택할 수 있다고 생각합니다.

1. step: 

SELECT DISTINCT id, first_name, last_name 
FROM users INNER JOIN 
posts ON posts.user_id = users.id 
WHERE [last 24 hours] 

2. step: 

SELECT * 
FROM posts 
WHERE user_id = @userId AND [last 24 hours] 

이 방법 원인 많은 데이터베이스 호출하지만, 적은 메모리 사용, 당신은 단지 한 번에 한 사용자에 대한 메시지를 검색하기 때문이다.

+0

수십 개의 쿼리를 실행하는 것이 더 좋습니다. 그는 지난 24 시간 동안 게시물이있는 사용자가 많을 수 있습니다. – JNK

+0

모든 메시지를 읽고 사용자 세부 정보의 데이터를 메모리에 복제하는 것이 더 좋다고 생각합니다. – pistipanko

+0

예. 이 경우에는 행 당 20-30 바이트가 추가로 필요합니다. 그 영향은 수백 건의 데이터베이스 호출보다 훨씬 적습니다. – JNK

0

최상의 해결책은 각 테이블의 행 수와 사용자 당 하루 게시물 수에 따라 다릅니다.

게시물 수가 적고 사용자가 많으면 한 번에 게시물과 사용자를 모두 선택하면됩니다.

사용자 당 사용자 수와 게시물 수가 많지 않은 경우 별도로 선택하는 두 번째 옵션을 사용하는 것이 좋습니다. 먼저 지난 24 시간 동안 게시물을 선택하면 다음과 같이 작성자를 선택할 수 있습니다.

SELECT users.id, first_name, last_name 
FROM users 
LEFT JOIN posts ON users.id = user_id 
WHERE [posts in the last 24 h] 
관련 문제