2011-01-30 3 views
0

나는 쿼리 너무 익숙하지 오전하지만 여기에 질문 : 내 '이웃'테이블은 열이테이블 열 질문 - ID 또는 아니오로 이름 중복?

n_id, name, country_id, continent_id, city_id. 

어디 n_id = PK와 country_id, continent_id, CITY_ID가 자신의 테이블에 FKS 있습니다.

샘플 데이터는 다음과 같습니다

34, Brooke, 23, 3, 1456 

이 출력은 데이터 관계에 대한 좋은하지만 사용자 출력을위한 것입니다. 웹 사이트에서 Brooke를 볼 때 사용자 측에 있어야합니다. 브룩, 뉴욕 - 미국. (본질적으로 브룩, 1456 - 23).

질문 : 내가 이웃 테이블에 ID 만 저장하면 매번 2 개의 테이블을 결합하여 ID 이름을 가져와야합니다.

n_id, name, country_id, country_name, continent_id, city_id, city_name 

은 두 가지로 성능 차이 무엇입니까 : 그래서 열 수 있도록 테이블에 중복으로 다시 이름을 저장하는 것이 좋습니다이를 방지하려면? 또는 장점 또는 단점?

** 사이트가 도움이된다면 사이트는 소셜 네트워크입니다.

+0

{country_id}이 {country}을 결정하지 않아 {continent}가 결정되지 않습니까? 아니면 '뉴욕'이 독일의 호주에있을 수 있습니까? – Ronnis

답변

0

데이터베이스 디자인에서 가장 중요한 규칙은 데이터가 반복되어서는 안된다는 것입니다. 귀하의 디자인은 괜찮아 보입니다. 표시해야하는 데이터를 가져 오기 위해 두 개의 조인을 작성해야한다는 사실에 신경 쓰지 마십시오. 몇 백 줄에 이르는 쿼리가 있습니다.

단일 테이블에서 오는 데이터는 자연스럽게 나타납니다 두 테이블에서 오는 것보다 빠릅니다.

+0

사실 그렇지만 소셜 네트워크의 경우 포럼에서 읽은 조언은 성능이 결국 사이트를 만들거나 깨뜨릴 수 있으므로 가능한 한 많은 데이터를 비정규 화합니다. – SeanD

+0

@SeanD : 모든 것을 믿지 마십시오. 읽기 - * 측정 * 자신을 위해, 당신의 설정. –

+0

엄청난 양의 데이터를 다루는 소셜 네트워크와 검색 엔진은 매우 정교한 수단으로 매우 빠른 데이터 처리를 사용합니다. "일반"데이터 세트 및 일반 조인의 경우 정상이어야합니다. 페이스 북과 구글 같은 특별한 요구 조직을 위해, 그들은 "큰 테이블"과 같은 새로운 데이터 구조와 "hadoop"과 같은 "no-sql"기술을 배포 할 수 있습니다. –

0

일반적으로 데이터를 올바르게 표준화 한 다음 비정형 화하여 특정 성능 문제를 해결하는 것이 가장 좋습니다. 성능 문제가 있습니까? ID 전용 옵션을 설정하고 테스트 할 수 있습니까?

첫 테이블 디자인에는 데이터 정규화 (Google 삽입, 삭제 및 업데이트 이상)의 모든 일반적인 이점이 있습니다. ID가 있거나 이웃 테이블에 ID가없는 경우 ID가 있거나 이웃 테이블에 ID가없는 경우 프로세스가 항상 동일해야합니다 (예 : 입력되지 않은 미리 채워진 드롭 다운에서 선택). 업데이트 방법 이 경우, 이름 변경 등

당신이 진짜 성능 문제가있는 경우이 여분의 effoprt. Otherwaise이 표준화 된 솔루션을 유지 가치가있을 수 있습니다.

0

이 트랜잭션 데이터베이스에서 데이터를 반복하지 마십시오.

올바르게 정규화하고 조인 성능에 대해 염려가되는 경우 적절할 경우 인덱스를 추가하고 조인 조건을 정렬하여 쿼리를 조정할 수 있습니다. 공급 업체가 선택한 쿼리 계획을 이해하는 데 도움이됩니다. 또한 현대 데이터베이스는 더 많은 데이터를 먼저 필터링하는 테이블 조인을 선택하여 추가 조인 조건이 덜 비쌉니다.

데이터웨어 하우스는 데이터를 복사하여 변경되지 않은 기록 정보에 대한보고를 최적화합니다.

1

인접 테이블에 중복 된 이름을 추가 할 때이를 역 정규화합니다. 비정규 화는 특히 시스템 부하가 매우 큰 경우 쿼리를 더 빠르게 만듭니다.그러나 중복 데이터를 동기화 상태로 유지하려면 추가 코드를 작성하고 유지 관리해야하므로 비용이 발생합니다.

나는 마음에이 일을 계속 것 :

  1. 을 일반적으로 뭔가를 최적화 결코 당신이 그것을 optimze 할 필요 입증 될 때까지 (Abrash의 규칙 # 1)
  2. 당신이 당신의 조인을 찾을 경우 빠른 속도가 필요합니다. 시도 할 첫 번째 최적화는 색인을 조정하는 것입니다. 이렇게하면 정규화 된 디자인의 이점을 잃지 않고 빠른 조인을 수행 할 수 있습니다.
0

제안 된 비정규화된 디자인의 주요 단점은 올바른 참조 무결성 제약 조건과 업데이트 동작이 지나치게 복잡해진다는 것입니다. City_ID 1456과 관련된 데이터가 변경되면 City 테이블의 한 행을 변경해야 할뿐만 아니라 City 테이블 (City_ID = 1456 포함)을 상호 참조하는 각 NBighbourhood 행의 저장된 값을 변경해야합니다. . 이러한 '업데이트 이상'은 정규화 원칙의 주요 원인입니다.

성능을 측정하는 것은 까다로운 작업입니다. 그것은 DBMS와 테이블의 크기에 달려 있지만, 큰 테이블을 모두 스캔하는 것보다 더 작은 테이블을 결합하는 것이 더 빠를 것이라고 생각할 수 있습니다 ('큰 테이블'은 제안 된 수정 된 Neighborhood 테이블이 모두 추가하려는 추가 데이터). 예를 들어 Neighborhood 테이블에서 City_ID 및 City_Name 열을 모두 색인화하지 않으면 (따라서 정규화 된 디자인보다 색인에서 더 많은 공간을 사용함) 한 도시의 모든 사람들을 검색하는 데 더 오래 걸릴 수 있습니다 Neighborhood 테이블을 순차적으로 읽어야합니다.) City_ID를 찾기 위해 City 테이블의 인덱싱 된 룩업보다, 그리고 Neighborhood 테이블에서 정확한 City_ID에 대한 인덱스 스캔을 수행하십시오.

따라서 비정규 화 된 '효율적인'디자인은 현재의 정규화 된 디자인과는 다른 여러 가지 측정 방법으로 효율성이 떨어질 수 있습니다.

현재 정규화 된 디자인에서 변경하려면 측정을 사용하십시오. 업데이트 작업의 복잡성과 쿼리 속도뿐 아니라 사용되는 디스크 공간도 실제 비용과 같습니다. 비정규 화하는 것이 더 나을 수도 있습니다. 반드시 슬램 덩크 인 것은 아닙니다. 그리고 데이터의 크기가 변함에 따라 비용 방정식이 시간에 따라 변할 수 있으므로 측정을 여러 번 수행해야 할 수도 있습니다.

관련 문제