2011-11-11 2 views
5

일반적으로 나는 데이터베이스를 가능한 깨끗하고 확장 가능하게 유지하려고합니다.정규화 및 성능 : (이) 스키마에서 연결 테이블을 제거하는 이점/문제점?

그러나 일부 테스트를 수행 한 후 대용량 데이터 세트를 처리 할 때 대개 가장 좋은 방법 인 반면, 문제에 대한 "더티"접근 방식보다 훨씬 느리다는 것을 깨달았습니다.

기본적으로 개체 테이블이 있다고 가정 해 보겠습니다. 이 객체들은 특정 사람들에게 속합니다. 하나의 객체는 한 명을 가질 수 있지만 다른 객체는 한 명 이상있을 수 있습니다. 처음 생각한 것은 항상 내 객체의 객체 테이블, 내 사람들의 객체 테이블, 그리고 object_to_people 링커 테이블을 만드는 것입니다.

사람이 할당 된 모든 개체를 가져 오기 위해 개체와 링커 테이블을 결합하는 경우 약 400k 레코드를 기반으로하지만 개체 당 하나의 링크 만 사용하여 최대 3 초가 소요될 수 있습니다. 네, 또한 인덱스의 e.c.t를 설정합니다. 시도하고 속도를 올릴 수 있습니다.

사람과 링커 테이블을 제거하고 개체 테이블에 열을 넣고 1/0을 사용하여 각 사람이 해당 개체에 할당되었는지 여부를 설정합니다. 두 개의 큰 테이블을 결합하지 않고도 속도가 나타납니다. 약 0.3 -> 0.7 초 (크게 다양 함).

시작하려면 두 명이 필요합니다. 그러나 내가 그것을 도울 수 있다면 나는 너무 제한적이되고 싶지 않다. 나는 캐싱을 사용할 수 있고 최종 사용자 타이밍을 향상시키지 않을 수 있다는 것을 알고 있지만 링크 테이블보다는 열을 사용하는 것이 정말 나쁜 생각으로 여겨 질 수있는 이유가 무엇입니까?

+1

작은 그림은 스키마 관련 질문에 많은 영향을줍니다. –

+0

표준화. 별도의 "카테고리"열을 추가 할 수있는 유일한 시간은 "카테고리"목록이 잘 이해되고 제한되어있는 경우입니다. 귀하의 경우, 사람들의 성장이 기대됩니다 - 당신이 정상화하지 않기로 결정을 지불합니다 - 나는 약속드립니다 :-) – drdwilcox

+1

[정상화] (http://www.codinghorror.com/blog)에서 좋은 읽을 거리가 있습니다./2008/07/maybe-normalizing-isnt-normal.html) – Ibu

답변

2

비슷한 설정이 있습니다.
내 조인 테이블에 17,000,000 개의 행이 있습니다. 내 "person"테이블에는 840 만 개의 행이 있고 "objects"테이블에는 300,000 개의 행이 있습니다.

내 조인 테이블 및 수십만 개의 행을 반환하는 결과의 유니언에 대한 여러 조인이 있고 실행에 1 초 미만 (50-400ms) 걸리는 쿼리가 있습니다.

첫 레이아웃이 좋겠지 만 인덱스와 쿼리에 집중해야 할 것입니다.

0

그러나 이것이 링크 테이블이 아닌 열을 사용하는 것은 정말 나쁜 생각으로 여겨 질 수 있습니다.

난 당신이 얻은 성능보다 더 많은 확장 성을 중시한다면 정말 나쁜 생각이다 말할 것입니다.

확장 성 이상의 성능을 소중하게 생각한다면 실제로는 아이디어라고 할 수 있습니다.

0

한 개체가 둘 이상의 사람에게 동시에 속할 수 있다면 사실 ... 링크 테이블을 유지하십시오.

+0

까지 perofrmance - 어쩌면 쿼리에 대한 설명 계획을 보여줍니다 ... – Randy

0

큰 테이블의 alter table도 매우 오래 실행될 수 있으므로 합리적인 시간에 응용 프로그램에 새로운 사용자를 추가 할 수 없습니다.

관련 문제