정규화로 얼마나 멀리 가야합니까?


30

데이터베이스에 적절한 양의 데이터가 있습니다. 데이터가 중복되어 테이블과 테이블 간의 관계가 잘 형성되었습니다. 그러나 정규화로 얼마나 멀리 가야합니까? 너무 많은 정규화로 인한 성능 저하가 있습니까?

답변:


37

당신은 당신이 할 수있는 한 멀리 나아가 야합니다. 당연하지. ~ 문제는 이것이 약간의 예술이며 이것이 순수한 과학이 아닌 이유입니다.

당사의 주요 제품은 분석 및보고 시스템이므로 이와 관련하여 몇 가지 세부 기록이 있습니다. 우리는 처음에 일부 하위 레코드의 공통 ID로 많은 조인을 사용하도록 설계했지만 몇 개의 필드를 비정규 화하면 많은 조인을 잘라 내고 많은 성능 문제를 해결할 수 있음을 알았습니다.

그러나 우리는 1) "정규화 된"디자인을 만들고 2) 디자인을 사용하기 시작했기 때문에 3) 수십 개의 테이블에서 수억 행에 이르는 실제 성능을 프로파일 링했다는 사실 만 알았습니다.

마지막 이야기는 우리가 프로필을 작성하기 전까지는 무엇이 우리에게 도움이 될지 확신 할 수 없었습니다. 더 쉽게 업데이트 할 수 있도록 정규화 아이디어가 마음에 들었지만 결국 실제 성능이 결정적인 요소였습니다. 그것은 당신을위한 나의 충고입니다 : 프로필, 프로필, 프로필.


4
과학이 아닌 예술은 그것이 부두라고 믿는 것을 빌려줍니다. 어떤 참조?
abel

3
@ 아벨 내 일화는 어떻습니까? 프로파일 러는 비정규 화 규칙을 제안 할 수 있지만 이러한 규칙은 경험이 풍부한 프로그래머가 제공합니다. 모든 프로그래밍은 예술입니다. 나중에 풀 키보드를 사용할 때 같은 말을 한 유명한 사람을 찾을 수 있습니다.
jcolebrand

1
@Abel 아 잘 다음 모든 in ('forgiven','pardoned');) : p
jcolebrand

2
@ Fergus는 당신이 그것을 좋아 기쁘다. 나는 항상 일화가 가장 잘 작동한다는 것을 알았습니다.
jcolebrand

2
@abel- '예술은 7도 이상의 자유를 가진 과학입니다'. 특정 수준의 복잡성을 넘어서 문제에 대한 철저한 접근은 불가능 해집니다. 이 시점에서 경험에 기반한 휴리스틱 접근 방식이 가장 효과적입니다. 안타깝게도, 컴퓨팅 분야에서 그 수준의 복잡성은 사소한 소프트웨어 시스템 이외의 모든 것에서 달성하기가 매우 쉽습니다.
ConcernedOfTunbridgeWells

10

정규화는 데이터 모델을 충분히 지원할 수있는 경우에만 목표입니다. 성장, 관리 및 유지 관리를 지원하기위한 지침이 될 것입니다. 정규화에 대한 책이나 필자가 데이터베이스 나 응용 프로그램을 작성하거나 유지 관리한다는 것을 기억하십시오.

"너무 많은 정규화"라는 주제에 대해 잘 읽어 보았습니다.

그리고 너무 많은 정규화에 성능 영향이있을 수 있습니다. 이것은 상태 표시기 테이블과 같은 것을 별도의 테이블로 가져올 때 가져 오기 위해 더 깊은 테이블 순회에 있습니다. 일부는 업데이트 속도 (상태 텍스트를 "Good"에서 "GOOD"또는 이와 유사한 것으로 변경) 또는 유지 보수성에서 일반적으로 무시된다고 말합니다.


2
이 주제에 대한 추가 정보와 훨씬 더 재미있는 qntm.org/gay
jcolebrand

5

Chris Date 에서 찾은 다음 부록을 읽는 것이 좋습니다. 의 최근 저서 .

정규화를위한 두 건배

정규화는 만병 통치약과는 거리가 멀다. 우리는 목표가 무엇인지, 목표에 얼마나 잘 부합하는지 쉽게 알 수 있기 때문에 ...

이 섹션의 설명이 어떤 종류의 공격으로도 표시되지 않도록해야합니다. 나는 완전히 정규화 된 디자인보다 적은 것은 금기 사항이라고 굳게 믿습니다 ...


2

추가 된 비정규 화, 추가 된 집계 값 또는 세부 사항 복사로 복사 된 마스터 테이블의 일부 필드를 보는 것이 똑같이 중요하다고 생각합니다.

이 주장은 주로 어떤 성과 주장이다.

그렇게하는 경우 해당 필드는 트리거에 의해 업데이트되며 일관성을 유지하기 위해 데이터베이스에 달려 있습니다.


2

나는 @jcolebrand에 전적으로 동의합니다. 애플리케이션을위한 모델을 설계 할 때는 가능한 모든 것을 정규화해야합니다. 그러나 모델을 통해 작성된 쿼리, 특히 자주 실행되는 쿼리를 프로파일 링해야합니다.

내 자신의 경험 : 두 개의 조인에 도달 한 속성 (즉, 세 개의 테이블이 조인 됨)은 대부분 성능을 저하시킵니다. 최악의 경우 온라인 거래에 사용됩니다. 속성을 비정규 화 했으므로 하나의 조인이 필요하며 프로그래머에게 쿼리에 대한 앱을 조정하고 속성을 업데이트하도록 요청했습니다. 이제 훨씬 잘 작동합니다 ...

다시 말해 정규화와 성능의 균형을 유지해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.