[SQL] 데이터베이스를 비정규 화하는 경우 디자인 [마감]
SQL데이터베이스를 비정규 화하는 경우 디자인 [마감]
나는 정상화가 광범위하게 스택 오버플로 논의되었다 알고있다. 나는 이전 토론을 많이 읽었습니다. 그래도 몇 가지 추가 질문이 있어요.
나는 적어도 100 개 테이블과 레거시 시스템에서 일하고 있어요. 데이터베이스는 일부 미 정규화 구조, 분산 된 데이터의 종류 및 기타 문제를 포함하는 테이블을 가지고있다. 나는 그것을 개선하기 위해 노력하는 작업을 주어 왔습니다. 난 그냥 다시 시작하지만 기존의 스키마를 수정할 필요가 없습니다.
과거에 나는 항상 정규화 된 데이터베이스를 설계하는 노력했다. 이제 질문입니다. 고위 개발자는 제안했다 우리가 정상화 할 수없는 경우에 :
1) 시간 데이터. 예를 들어 송장은 제품 그 링크가 생성됩니다. 고객이 연간 송장이의 사본을 요청하는 경우 나중에 우리는 원래의 정확한 사본을 만들 수 있어야합니다. 어떤 제품 가격, 이름 또는 설명이 업데이트 된 경우? 고위 사람은 가격 및 기타 제품 정보가 송장 테이블에 복사해야한다고 제안했다. 나는 우리가 시간이 지남에 따라 가격의 변화를 추적 할 수 어쩌면 우리가 날짜 필드를 갖도록 productPrice 같은 다른 테이블이 있어야합니다 생각하고 있어요. 우리는 제품 설명을 위해 같은 일을 필요 같아요 이름을 것인가? 복잡하게 보인다. 어떻게 생각해?
2) 데이터베이스는 회계 시스템입니다. 나는 회계에 익숙하지 않다. 현재는 일부 요약 데이터가 파생되고 데이터베이스에 저장됩니다. 올해 예를 들어 총 판매하십시오. 내 선임 연구원은 회계사가 실제로 응용 프로그램이 제대로 작동하는지 그들에게 확신을주고 송장 등으로부터 계산 된 데이터와이 값을 비교하여 일이 올바른지 확인하기 위해 좋아하는 말했다.
그는 합계가 동일하지 않을 실수 때문에 누군가가 작년 송장을 삭제 한 경우, 예를 들어 지금 우리가 알 수 있다고 말했다. 그는 또한 즉석에서이 합계를 계산하는 것은 매우 느린 될 수 있다고 지적했다. 물론 그 데이터를 복제 할 수 없습니다해야하며, 필요할 때 항상 계산해야했다. 나는 우리가 SQL보고 서비스 또는 하룻밤이 보고서를 생성하고이를 캐시합니다 다른 솔루션을 사용할 수 있다고 제안했다. 어쨌든 그는 확신 아니에요. 여기에 대한 의견?
해결법
-
==============================
1.귀하의 고위 동료 개발자가 아닌 데이터 모델러입니다. 당신은 그들없이, 처음부터 시작하는 것이 더 낫다. 정규화은 책을 읽지 않습니다 사람들에게 복잡하다. 그가 당신이 생각하게 만들지 만 몇 가지 문제가 불합리한 것을 공정 충분하다.
귀하의 고위 동료 개발자가 아닌 데이터 모델러입니다. 당신은 그들없이, 처음부터 시작하는 것이 더 낫다. 정규화은 책을 읽지 않습니다 사람들에게 복잡하다. 그가 당신이 생각하게 만들지 만 몇 가지 문제가 불합리한 것을 공정 충분하다.
귀하의 번호 :
-
==============================
2.1)이 아카이브이다. 그것은에있는 모든 업데이트해서는 안됩니다. 나는 수석 남자의 제안에 가서 그 송장 테이블 자체에 포함 할 수있을 것입니다. 아마도 마크 업 언어를 포함 송장 자체에 대한 방울을 사용합니까?
1)이 아카이브이다. 그것은에있는 모든 업데이트해서는 안됩니다. 나는 수석 남자의 제안에 가서 그 송장 테이블 자체에 포함 할 수있을 것입니다. 아마도 마크 업 언어를 포함 송장 자체에 대한 방울을 사용합니까?
2) 서비스, 트리거 업데이트되는 창고 테이블을보고,이 모든 괜찮을 것마다 ... 스크립트에 의해 빌드 뭔가, 나는 생각한다. 참으로 정상화하는 것이 이상적이지만, 항상 빠른 아니다. 나는 완전히 정규화 내가 관리하는 좋은 크기의 의료 데이터베이스를 가지고 ... 그리고 롤업 방정식과 일반적으로 뽑아 필드 드 정규화 된 일련의 테이블이 있습니다. 그 드 정상화 세트에서 거의 모든 실행 -이 파일이 여러 테이블이 나는 10 만 기록 보고서를보고 싶을 때마다에서 끌어 필요 유지하는 것보다로드 될 때 단지 빠른 트리거와 이들에 추가 할 수 있습니다.
-
==============================
3.당신은 그러나 당신이 정상화 완전히 명확하지 그것은 예를 들면, 무엇을 의미하는지, 유효한 포인트 인상
당신은 그러나 당신이 정상화 완전히 명확하지 그것은 예를 들면, 무엇을 의미하는지, 유효한 포인트 인상
이들이 있었던 것에 인보이스를 유지하는 데이터를 denormalizes 것을 1)에있어서 완전히 완전히 틀리다. 당신은 당신 만 현재 가격이 잘못 유지 가격의 역사를 계속해야한다고하는 비즈니스 요구 사항이 있으며이 요구 사항을 나누기 경우 -의 예를 들어 가격을 보자. 그리고 그것은 단순히 잘 설계된 아니에요, 정상화와는 아무 상관이있다. 비정규은 모델 (및 기타 유물)에 모호성에 대한 가능성을 도입에 관한 것입니다 -이 경우 당신은 단순히 제대로 문제 공간을 모델링되지 않습니다. 아무것도 잘못은 시간 데이터를 지원하는 데이터베이스를 모델링 (또는 버전 및 / 또는 아카이브 / 시간으로 데이터베이스의 영역을 분리하고 작업 집합)에 있습니다.
(요구 사항의 측면에서) 의미를 보지 않고 정상화 보는 것은 불가능하다.
당신의 수석 개발자가 그 차이를 볼 수없는 경우, 나는 그가 RDBMS 개발에 그의 선임을하지 않았다 추측;)
2) 두 번째 부분은 참으로 비정규입니다. 그러나 만약 당신이 심각하게 정상화를 설교 수석 DB 분석을 통해 실행하는 경우, 당신이 그를 듣게 될 것입니다 / 그녀는만큼 당신이 의식적으로 그것을로 비정규 그 혜택을 과체중 결함을 확인하고 이상 당신을 물지 않을 것이라는 점을 완벽하게 받아 들일 수 있다고 말한다. 또한 논리적 모델을 정상화 당신을 말할 것이다 물리적 모델에서 당신은 다양한 목적 (성능, 유지 보수 등)을위한 이상적인 이탈 할 수 있는지. 내 책에서 정상화의 주요 목적은 숨겨진 이상 (예 : 5NF에이 문서를 참조하십시오)하지 않도록이다
당신이 (캐시의 일종으로) 응용 프로그램 계층에서 그것을 할 수 있습니다 또는 당신은 데이터베이스 수준에서 그것을 할 수 있습니다 또는 당신이 데이터웨어 하우스를 가질 수 - 중간 결과의 캐싱도 표준화 된 데이터베이스와도 정상화의 가장 큰 복음 전도자에 의해 허용 이러한 목적. 이들은 모두 유효한 선택하고 논리적 모델을 정상화와는 아무 상관이 없습니다.
또한, 회계사에 관해서는 - 당신은 무엇을 그가 주장하는 것은 좋은 테스트 아니라고 설득 사용자 개입없이 시스템의 테스트를 자동화 것이다 (그와 어쩌면 함께) 테스트 세트를 개발하고 당신을 제공 할 수 있어야한다 시스템 버그 무료입니다 높은 자신감.
반면에 나는 전이나 항목이 완료되었음을 보장하기 위해, 실제 라인을 입력 한 후 송장 라인의 번호를 입력하는 등 사용자가 중복 된 정보를 입력해야 시스템, 알고. 이 데이터는 '복제'하고 당신은 당신이 입력을 검증하는 절차가있는 경우 저장할 필요가 없습니다. 그 절차는 나중에 온다 '비정규'데이터를 저장할 수있는 경우 - 다시, 의미는 그것을 정당화하고 정상화대로 모델을 볼 수 있습니다. (이 개념의 주위에 당신의 머리를 정리하는 데 도움이됩니다)
편집하다: 당신이 정상적인 형태의 공식적인 정의를보고 당신이 고려하는 경우 설계가이 분명 일부 사람들에 일반 양식 (중 하나를 나누기 경우 비정규 및 다른 방법이없는 경우 (2)에서 "비정규"이 용어는 정확하지 않습니다 ) 그것에 대해.
그럼에도 불구하고, 당신이 사람과 필요하지 쓸모없는 텍스트의 많은 시도가 데이터베이스에 중복을 줄일 수 있다는 어떤 노력에 대한 용어의 표준화를 사용한다는 생각에 익숙해 할 수 있습니다 (다만 예를 들어, 당신은으로, 과학 논문을 찾을 수 있습니다 파생 그 전화가 비정규의 양식을 어떤 속성 나는 그들이 그냥 일반적인 것을 경고로, 바로해야한다는 말을하지 않습니다) 여기를 참조하십시오.
당신이 (다시, 모두가 인식되지 않음) 좀 더 일관되고 인정 기관에 참조 할 경우, 아마도 C.J.Date의 말은 명확한 구분을 할 수 있습니다 :
깊이 데이터베이스에서 인용 : 실무자를위한 관계형 이론을
다음 페이지에
그래서, relvars에 걸쳐 중복에 대한 적절한 용어는 직교성 (당신이 정상화에 엄격하게 보면이 모든 개선 사항을 제안하지 않을 것 때문에 기본적으로 모든 정상적인 형태로 인해 두 개의 서로 다른 relvars 간의 종속성에 단일 relvar에 대해 이야기)입니다.
어쨌든, 당신은 데이터베이스 설계를 고려 다른 중요한 개념 중 하나는 논리적 및 물리적 데이터베이스 모델의 차이도있다. 당신이 설정하고 모델하려고하는 개념 사이의 관계를 조사하기 위해 시도 - 같은 합계 또는 인덱스가있는 테이블과 같은 물리적 수준에서 유용한 것들의 많은 논리적 모델에서 곳이 없다. 그리고 당신이 말할 수있는 이유의 그들은 허용 그리고 그들은 디자인을 파괴하지 않습니다.
선은 때로는 논리적 모델과 물리적 모델은 무엇 무엇에 조금 흐릿하게 할 수 있습니다. 특히 좋은 예는 소계가있는 테이블이다. 그것은 물리적 구현의 일부로 고려하고 당신이 가지고있는 논리 레벨에 무시하려면 :
당신은 위의 규칙 중 하나를 깰 경우에 당신은 일관성이 사실을 제공 할 것입니다 일관성이 데이터베이스로 끝날 것입니다. (당신이 공식적으로 수정하거나 문제가 발생 조사하기위한 절차를 설계하려는 경우와 같은 경우에, 당신은 그것을 논리적 수준에서 존재하는 것, 그냥 추가 테이블을 고려하지 않을 것, 그것은 안 경우).
또한, 정상화는 항상 의미하고 모델링하려고하는 비즈니스 규칙에 따라 달라집니다. 예를 들어 DBAPerformance 트랜잭션 테이블에 TAXAMOUNT를 저장하는 디자인을 비정규되지 않는 예를 제공하지만, 그는 그것이 (즉, 분명?) 종류의 모델하려고하는 시스템의 어떤 달려 언급하지; 키가 아닌 속성 세트에 함수 적 종속성이 있기 때문에, 예를 들어 트랜잭션이 TaxRate라는 또 다른 속성은 일반적으로 비정규 될 경우 (TAXAMOUNT = 금액 * TaxRate => FD : 금액, TaxRate -> TAXAMOUNT), 그리고 이들 중 하나 제거되거나 일관성이 보장되어야한다.
당신이 구축하는 시스템이 감사 회사 인 경우 물론, 당신이 말하는하지만, 수도, 당신은 함수 적 종속성이 없을 수도 있습니다 - 그들은 수동 계산을 사용하거나 결함이있는 소프트웨어가 있거나 불완전한 데이터를 기록 할 수있는 능력이 있어야한다 감사의 사람이 될 수 그리고 계산이 잘못 원래 수 있습니다 그것이 일어난 감사 기업으로 당신은 사실을 기록해야합니다.
일반적인 형태 중 하나가 깨진 경우에 따라서, 요구 사항에 의해 결정됩니다 의미 (술어) 영향을 미칠 것이다 - 함수 종속에 영향을 미치는가 (제대로 기능 종속성을 수립 다른 말로하면 정규화 된 데이터베이스에 대한 노력하면 모델링의 매우 중요한 부분입니다).
-
==============================
4.나는 당신의 선임에 대해 (1)에 동의합니다. 트랜잭션 테이블 행은 트랜잭션의 순간에 전체 상태를 캡처해야합니다. 기간. 당신은 허용 할 수없는, 그래서 실제 데이터를 기록하지 않습니다 제안하고 있습니다. 또한 (2)에 대해 동의합니다. 사업이 crosschecking의 방법으로 원하는 무엇이든간에, 당신은 구현해야합니다. 회계는 당신이 그것을 수행해야합니다 교차 검사, 복식, 원장을 압연 등을 기반으로합니다. 당신도 바로 비즈니스 요구 사항을 구현으로, 비정규로에 보이지 않는 것을이 때문에 기본.
나는 당신의 선임에 대해 (1)에 동의합니다. 트랜잭션 테이블 행은 트랜잭션의 순간에 전체 상태를 캡처해야합니다. 기간. 당신은 허용 할 수없는, 그래서 실제 데이터를 기록하지 않습니다 제안하고 있습니다. 또한 (2)에 대해 동의합니다. 사업이 crosschecking의 방법으로 원하는 무엇이든간에, 당신은 구현해야합니다. 회계는 당신이 그것을 수행해야합니다 교차 검사, 복식, 원장을 압연 등을 기반으로합니다. 당신도 바로 비즈니스 요구 사항을 구현으로, 비정규로에 보이지 않는 것을이 때문에 기본.
-
==============================
5.귀하의 수석 개발자는 매우 유효한 지점을 수 있습니다. 나는 정규화 해제 히스토리 데이터를하지 않는 시스템을 서비스함으로써 이들에게 자신을 어려운 방법을 배웠다.
귀하의 수석 개발자는 매우 유효한 지점을 수 있습니다. 나는 정규화 해제 히스토리 데이터를하지 않는 시스템을 서비스함으로써 이들에게 자신을 어려운 방법을 배웠다.
어떤 의미에서 그것은 정말 데이터베이스에 오버 헤드를 추가 아니에요. 당신은 데이터베이스에있는 기존 데이터에서 송장 테이블을 만들 수 있습니다. 송장은 시간에 스냅 샷입니다. 당신은 너무 쉽게보고 할 수있는 송장을 생산하는 데 필요한 정보를 드-정상화. 당신이 새 보고서를 생성하는 데 필요한을 신속하게 할 것으로 예상된다 때 당신은 드 정상화를 주셔서 감사합니다.
데이터베이스에 총을 가진 측면에서. 이것은 내가 (안 당신이 생각하는 수 있으므로 하드 등) 같은 방법을 추가 할 수 없습니다 숫자를 발생하는 응용 프로그램에 변경 한 경우 이전에 내 엉덩이를 저장하고있다. 라이브 응용 프로그램에서 합계는 나에게 불일치를 수정하기로 돌아가려면 확실한 자리를했다. 난 당신이 여기 읽을 수 있습니다 전에 이것에 대해 서면으로 작성했습니다 : http://jlrand.com/?p=95
-
==============================
6.1) 비 표준화가 필요하지 않습니다. 당신은 당신이 필요로하는 각 변경의 세부 어떤 수준을 결정하고 적절한 키 있음을 지속 할 필요가있다.
1) 비 표준화가 필요하지 않습니다. 당신은 당신이 필요로하는 각 변경의 세부 어떤 수준을 결정하고 적절한 키 있음을 지속 할 필요가있다.
2) 비정규과는 아무 상관이 없습니다. 요약 데이터를 저장하는 것은 비정규 데이터베이스를하지 않습니다. 비 키에서 파생 된 결과를 저장하는 것은 비정규의 예 것 같은 테이블 속성하지만 당신이 여기에 대해 무슨 말을 될 것 같지 않습니다.
-
==============================
7.# 1의 경우
# 1의 경우
송장은 판매 및 지불 계산해야한다. 당신은 가격 / 제품 / 할인 / 배송 / 등을 포함하여 자세한 판매 데이터가없는 경우가를 시작합니다.
# 2
처음부터 데시벨로 회계 시스템을 작성하는 것은 큰 프로젝트입니다. 당신이 당신의 시스템 정확도를 측정 할 수 있도록 당신이 회계사는 당신에게 비즈니스 규칙을 제공해야합니다. 당신이 원하는 마지막 것은 DBA 회의에 CFO 단계이며, DB가 더 악화 당신이 과소 및 사업을 회사를 운전하는 고객을 과충전되어 발표합니다.
당신이있는 경우 SQL Server는 모습 dB 모험 작품을 제공합니다. 당신이 다음 어드벤쳐 작품을보고 MS 싫어한다면 그것은 그런 식으로하지.
-
==============================
8.데이터베이스 정규화 중복을 제거하고보다 효율적인 데이터 업데이트에 대한 SQL 쿼리를 만드는 (그리고 다른 향상된 기능을 제공합니다).
데이터베이스 정규화 중복을 제거하고보다 효율적인 데이터 업데이트에 대한 SQL 쿼리를 만드는 (그리고 다른 향상된 기능을 제공합니다).
쿼리의 대부분이 데이터를 선택하고 선택 쿼리는 한 번에 여러 테이블에 연결을 위해 사용하는 경우, 당신은이 테이블의 비정규을 고려할 수 있습니다. 이 데이터에 필요한 디스크 공간, SQL 업데이트 쿼리 시간 실행의 양을 증가하지만 선택 쿼리를 향상시킬 수 있습니다.
-
==============================
9.오히려 여부를 사용자가 데이터웨어 하우스를 작성해야합니다 고려하고있는 것처럼 보인다. 당신은 내역보고 목적으로 데이터베이스를 비정규해서는 안됩니다. 정보의 비정규 가장 및 데이터 기록을 유지 관리 : 아카이브를 생성 및 데이터웨어 하우스로 정보를 저장하는 것은 둘 다 할 것입니다.
오히려 여부를 사용자가 데이터웨어 하우스를 작성해야합니다 고려하고있는 것처럼 보인다. 당신은 내역보고 목적으로 데이터베이스를 비정규해서는 안됩니다. 정보의 비정규 가장 및 데이터 기록을 유지 관리 : 아카이브를 생성 및 데이터웨어 하우스로 정보를 저장하는 것은 둘 다 할 것입니다.
from https://stackoverflow.com/questions/4301089/when-to-denormalize-a-database-design by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 MySQL의 테이블에 열을 이동? (0) | 2020.05.07 |
---|---|
[SQL] 최저 근무 시간 저장하는 방법과 쿼리를 효율적으로 (0) | 2020.05.07 |
[SQL] 어떻게 T-SQL에서 디버그 시간에 테이블 변수의 값을 볼 수? (0) | 2020.05.07 |
[SQL] 어떻게 데이터베이스에 숫자의 정밀도와 스케일을 해석합니까? (0) | 2020.05.07 |
[SQL] 클라이언트 IP 주소에 대한 최대 길이 [중복] (0) | 2020.05.07 |