6

데이터베이스를 디자인하고 있는데 데이터베이스를 표준화하고 싶습니다. 한 가지 질문으로 나는 약 30-40 개의 테이블을 합칠 것입니다. 웹 사이트 성능이 극단적으로 인기를 얻으면 이런 결과가 나쁠까요? 이것은 메인 쿼리가 될 것이며 그것은 시간의 50 %라고합니다. 다른 쿼리는 약 두 개의 테이블을 결합합니다.정규화로 트래픽이 많은 사이트의 성능이 실제로 저하됩니까?

정상화하거나 정상화하지 않도록 선택할 수 있습니다. 그러나 정상화가 앞으로 문제가 될 경우 소프트웨어의 40 %를 다시 작성해야 할 수 있으며 오랜 시간이 걸릴 수 있습니다. 이 경우 정규화가 실제로 상처를 받습니까? 시간이있는 동안 지금은 비정규 화해야합니까?

+2

엄청난 양의 코드 재 작성 (사용자 코드의 40 %) 위험을 감수하지 않아도됩니다. 정규화를 시작했지만 대부분의 코드에 필요한 추상화를 제공하기 위해 뷰를 사용하는 경우 ... 뷰가 추상화 계층으로 제공해야하는 스키마로 비정규 화해야하는 경우 대부분의 코드 변경 사항을 제거해야합니다. –

+1

비정규 화 테이블을 업데이트해야 할 때 오버 헤드 (작업량 측면에서)를 고려해야합니다. 클라이언트 주소를 변경하면 한 자리에서 변경하는 대신 비정규 화 된 테이블의 모든 행을 스캔하여 변경해야합니다 그것. 어쩌면보기가 가장 좋은 옵션 일 수 있으며, 너무 느린 경우 더 많은 하드웨어 리소스를 데이터베이스에 할당하십시오. – slugster

+1

저는 왜 30-40 개의 테이블이 필요한지 그리고 왜 이들을 합쳐야하는지 알고 싶습니다. 이것은 나에게 맞는 것 같지 않으므로 테이블이 무엇을하고 있는지 설명해 주시기 바랍니다. –

답변

4

내가 인용 : "속도를 비정규 화, 정확성 정상화 - 그리고 필요한 경우에만"나는 당신을 참조

: In terms of databases, is "Normalize for correctness, denormalize for performance" a right mantra?

HTH.

+3

+1. 데이터베이스를 정규화하지 않습니다. _ 항상 _3NF로 시작하십시오. 속도가 필요한 경우에만 _에 해당하는 경우 낮은 속도로 되돌립니다. 그리고 당신이 그 결과와 해결책을 이해했는지 확인하십시오. 비정규 화 (트리거, 계산 열 등)로 인한 문제를 완화 할 수있는 방법이 있습니다. YAGNI :-) – paxdiablo

+0

30-40 개의 테이블이 문제가되지 않는다고 생각하십니까? 또한 정규화가 문제가된다면 정규화 비용을 상쇄하기 위해 더 나은 하드웨어를 추가 할 수 있습니까? – Luke101

+1

@ 루크 : 아니오, 40 점의 테이블을 합치는 것이 문제가 될 수 있습니다.이 시점에서 비정규 화를 고려해야합니다 (그러나 문제가 발생한 후에 만 ​​존재할 수없는 문제를 예측하지 말고 측정하지 말고 추측하지 마십시오). 그러나 나는 많은 테이블에 대한 조인이 필요한 3NF 스키마에 많은 관심을 보였습니다. 내 경험상, 나는 극단적 인 상황을 한번도 경험하지 못했다. 어쩌면 당신이 그면에 더 많은 세부 사항을 추가한다면, 우리는 더 잘 이해할 수 있고 좀 더 구체적인 조언을 제공 할 수 있습니다. – paxdiablo

0

초기 최적화를하지 마십시오. 비정규 화는 웹 사이트의 속도를 높이는 유일한 방법은 아닙니다. 캐싱 전략 또한 매우 중요합니다. 30-40 개의 테이블에 대한 쿼리가 상당히 정적 인 데이터 인 경우 결과를 캐싱하면 더 나은 최적화가 될 수 있습니다.

또한 읽기 수에 대한 쓰기 수를 고려하십시오. 모든 삽입 또는 업데이트에 대해 약 10 개의 읽기를 수행하는 경우 데이터가 상당히 정적이라고 말할 수 있으므로 일정 기간 캐시해야합니다.

스키마가 비정규 화되면 결국 글이 더 비싸게되고 잠재적으로 속도가 느려질 것입니다.

너무 많은 최적화를하기 전에 문제를 실제로 분석하고 시스템의 병목 현상이 실제로 어디에서 발생했는지 궁금해지면 처음부터 최적화해야 할 부분에 대해 놀라게 될 수도 있습니다.

성능이 우려 비정규보다 일반적으로 더 나은 대안이있다,이다
+0

30-40 테이블은 전혀 정적이지 않습니다. 정상적인 날에는 약 1000 건의 업데이트와 삽입이 예상됩니다. – Luke101

+1

하루에 1000 건의 업데이트가 1 분당 1 개 미만입니다. 나는 그것을 상당히 정적이라고 부를 것이다. – Gabe

+0

동의. 그리고 글쓰기보다 읽기가 더 많다고 가정하면 캐싱 전략이 매우 중요하게됩니다. – jamesaharvey

3

:

  • 는 관련 테이블에 적절한 인덱스 및 통계 작성이
  • 캐싱
  • 구체화 된 뷰 (MS SQL Server의 인덱싱 된 뷰)
  • 대부분의 경우에 사용되는 정규화 된 테이블 외에도 테이블의 비정규 화 된 복사본이 필요합니다 (동기화 코드 작성이 필요합니다.이 코드는 tri gger 또는 예약 된 작업에 따라 달라질 수 있습니다.)
1

정상화로 인해 성능이 저하 될 수 있습니다. 그러나 이것은 조기에 비정규화할 이유가 없습니다.

전체 정규화로 시작한 다음 성능 문제가 있는지 확인합니다. 설명하는 속도 (하루에 1000 건의 업데이트/삽입)로 테이블이 커지면 문제가 발생하지 않을 것이라고 생각합니다.

데이터베이스 최적화 옵션 (색인, 준비된 저장 프로 시저, 구체화 된보기 등)이 많아도 사용할 수 있습니다.

1

아마도 여기에 뭔가 빠져 있습니다. 그러나 아키텍처에서 단일 쿼리로 30 ~ 40 개의 테이블을 조인해야하는 경우 쿼리가 사이트의 주된 사용이며 큰 문제가있는 광고입니다.

다른 사람들의 의견에 동의하지만, 귀하의 사이트를 중간에 최적화하지 마십시오. 그러나 주요 유스 케이스를 고려하여 아키텍처를 최적화해야합니다. 시간의 50 % 이상을 실행하는 쿼리에 대해 40 테이블 조인이 IMO에 최적화되어 있지 않습니다.

관련 문제