복붙노트

[SQL] 얼마나 멀리 정상화를 취할? [닫은]

SQL

얼마나 멀리 정상화를 취할? [닫은]

나는이 테이블이 :

Projects(projectID, CreatedByID)
Employees(empID,depID)
Departments(depID,OfficeID)
Offices(officeID)

CreatedByID 직원에 대한 외래 키입니다. 나는 거의 모든 페이지로드를 위해 실행되는 쿼리가 있습니다.

그것은 단지 세 개의 조인을 제거하기 위해 프로젝트에 중복 OfficeID 열을 추가하는 나쁜 관행인가? 아니면 다음을 수행해야합니다 :

SELECT * 
FROM Projects P
JOIN Employees E   ON P.CreatedBY = E.EmpID
JOIN Departments D ON E.DepID = D.DepID
JOIN Offices O     ON D.officeID = O.officeID
WHERE O.officeID = @SomeOfficeID

응용 프로그램에서 "이후 처음으로 모범 사례와 쓰기 및 최적화"나는 프로그래밍하지만, 데이터베이스 관리자는 항상의 조인 비용에 대해 경고하고있다.

해결법

  1. ==============================

    1.비정규 큰 쿼리에 대한 빠른에 select의 장점이있다.

    비정규 큰 쿼리에 대한 빠른에 select의 장점이있다.

    단점은 다음과 같습니다 :

    최적화에 관해서는, 당신은 DML 빠른 쿼리 또는 속도에 대한 중 최적화 할 수있다 (규칙으로,이 두 길항제).

    빠른 자주 쿼리에 대한 최적화하여 데이터를 복제 의미, 그것이 무엇이든의 인덱스, 여분의 테이블, 비정규합니다.

    인덱스의 경우, RDBMS는 당신을 위해 그것을 않지만, 비정규의 경우, 당신은 그것을 코드에 자신을해야합니다. 어떤 다른 사무실에 부서 이동하면? 당신은 세 개의 테이블 대신 중 하나를 해결해야합니다.

    그래서, 당신의 테이블의 이름에서 볼 수 있듯이,이 수백만 기록이되지 않습니다. 그래서 당신은 더 나은 정상화 데이터, 관리가 더 간단 할 것이다 것.

  2. ==============================

    2.표준화는 그 다음 비정규 작동까지, 상처까지

    표준화는 그 다음 비정규 작동까지, 상처까지

  3. ==============================

    3.항상 정상화까지 필요에 따라 데이터베이스 무결성 문제를 제거하는 방법 (즉, 잠재적 인 중복 또는 누락 된 데이터).

    항상 정상화까지 필요에 따라 데이터베이스 무결성 문제를 제거하는 방법 (즉, 잠재적 인 중복 또는 누락 된 데이터).

    (보통의 경우하지 않은) 역 정규화에서 성능 향상이 있었다하더라도, 데이터 무결성 손실의 가격이 너무 높은 정당화하는 것입니다.

    단지 그들이 (있는 경우) 속도가 증가 좋은 데이터 또는 하찮은를 선호 여부를 기존 데이터베이스에서 모든 모호한 문제를 해결에 대한 작업을했다 사람을 부탁드립니다.

    또한, 요한이 언급 한 바와 같이 - 당신이 (속도 /보고 / 등을 위해) 비정규 데이터를 필요로 끝날 경우 다음 원시 데이터를 보존, 별도의 테이블을 만들 수 있습니다.

  4. ==============================

    4.의 비용이 너무 많이 그 자체 (당신은 수백만 명의 사용자로 확장하려하지 않는 경우에 당신이 절대적으로 걱정한다) 당신이 걱정해야 조인.

    의 비용이 너무 많이 그 자체 (당신은 수백만 명의 사용자로 확장하려하지 않는 경우에 당신이 절대적으로 걱정한다) 당신이 걱정해야 조인.

    나는 더 많은이를 부르고 코드에 미치는 영향에 대해 우려거야. 표준화 된 데이터베이스에 대한 프로그램을 더 쉽게, 그리고 거의 항상 응용 프로그램 자체 내에서 더 나은 효율로 이어집니다.

    말했다 즉, 이성의 경계를 넘어되지 정상화 않습니다. 나는 보통 실제 데이터의 하나 개 또는 두 개의 테이블, 그리고 아무것도하지만 외래 키 가득 (20 개) 테이블이 데이터베이스에 끝 정상화를 위하여, 대한 정상화를 보았다. 즉 과잉 분명합니다. 컬럼의 데이터가 다른 중복 될 경우,이 정상화되어야한다 : 나는 일반적으로 사용되는 규칙입니다.

  5. ==============================

    5.세 번째 정규형에 해당 스키마를 유지하고 DBA가 비용을 조인에 대해 불평을하게하는 것이 좋습니다.

    세 번째 정규형에 해당 스키마를 유지하고 DBA가 비용을 조인에 대해 불평을하게하는 것이 좋습니다.

  6. ==============================

    6.당신의 DB가 제대로 시작 정규화되지 않은 경우 DBA 년대는 우려한다. 주의 깊게 성능을 측정하고 결정 후 당신은 당신이 비정규 시작할 수 병목 현상을 가지고 있지만, 나는 매우 신중해야합니다.

    당신의 DB가 제대로 시작 정규화되지 않은 경우 DBA 년대는 우려한다. 주의 깊게 성능을 측정하고 결정 후 당신은 당신이 비정규 시작할 수 병목 현상을 가지고 있지만, 나는 매우 신중해야합니다.

  7. ==============================

    7.나는 대부분의 당신이 매우 병적 인 상황에서가 아니라면, 조인의 비용에 대해 경고하고있다 DBA가 염려 될 것입니다.

    나는 대부분의 당신이 매우 병적 인 상황에서가 아니라면, 조인의 비용에 대해 경고하고있다 DBA가 염려 될 것입니다.

  8. ==============================

    8.당신은 당신이 다른 모든 것을 시도했습니다 전에 비정규 보지한다.

    당신은 당신이 다른 모든 것을 시도했습니다 전에 비정규 보지한다.

    이것의 성능은 정말 문제인가? 데이터베이스는 사용자가 무결성을 손상시키지 않고 속도로 일을 사용할 수있는 기능이 있습니까? 당신은 캐싱하여 성능을 향상시킬 수 있습니까?

  9. ==============================

    9.표준화는 디자인과의 관계에서 개념을 모델링합니다. 관계를 변경할 수있는 생각, 그와 같은 변화는 설계의 관점에서 무엇을 의미하는 것입니다.

    표준화는 디자인과의 관계에서 개념을 모델링합니다. 관계를 변경할 수있는 생각, 그와 같은 변화는 설계의 관점에서 무엇을 의미하는 것입니다.

    당신이 게시 된 스키마에서 (당신이 당신의 조직이 작동하는 방법의 측면에서 특별한 경우가있는 경우 오류를하지 않을 수있는)을 노려 오류처럼 나에게 모습이 - 모든 부서가 정확히에 있음을 암시 가정이있다 하나 개의 사무실, 그리고 사무실에서 같은 부서의 작업에있는 모든 직원이.

    어떤 경우 부서는 두 개의 사무실을 차지?

    직원이 명목상으로 한 부서에 속하지만 다른 사무실 밖으로 작동하는 경우 어떤 (물리적 사무실 언급하는 가정)?

  10. ==============================

    10.당신이 ID의 같은 정수 (또는 BIGINT)를 사용하는 그들은 클러스터 기본 키 경우에 당신은 괜찮을 것이다.

    당신이 ID의 같은 정수 (또는 BIGINT)를 사용하는 그들은 클러스터 기본 키 경우에 당신은 괜찮을 것이다.

    이처럼 보이지만 그것은 항상 당신이 항상 기본 키 인덱스가 너무 기본 키를 다룰 것 같은 차이는 최소한의 것 외래 키에 인덱스의 사용을 찾고있는 같은 프로젝트에서 사무실을 찾아 빠른 것입니다.

    혹시 데이터를 denormalise하기 위해 나중에 필요를 발견하면, 당신은 일정 또는 트리거에 캐시 테이블을 만들 수 있습니다.

  11. ==============================

    11.테이블에 제대로 설정 예제 주어진 인덱스에서 매우 빠르게 발생하는 조인 행의 10 만여 잘 확장 할 수 있도록한다. 이것은 일반적으로 내가이 문제를 해결하기 위해 수행하는 방법입니다.

    테이블에 제대로 설정 예제 주어진 인덱스에서 매우 빠르게 발생하는 조인 행의 10 만여 잘 확장 할 수 있도록한다. 이것은 일반적으로 내가이 문제를 해결하기 위해 수행하는 방법입니다.

    데이터가 일단 작성하고 정말 다스마다 조인 할 이해가되지 않았다 수명의 나머지 부분에 대한 선택하지만 것을 시간이있다.

  12. ==============================

    12.비정규하지 마십시오.

    비정규하지 마십시오.

    쉽게 시스템의 나머지 부분을 구현하는 것 간단하고 사운드 디자인 원칙에 따라 테이블을 디자인합니다. 빌드, 채우기, 사용 및 데이터베이스를 관리하기 쉽습니다. 쉽고 빠른가에 대한 쿼리 및 업데이트를 실행합니다. 쉽게 수정하고 상황이 그것을 호출 할 때 테이블 디자인을 확장, 불필요한 빛과 과도 이유로 그렇게 할 수 있습니다.

    디자인 원칙 중 하나 개 세트 정상화이다. 쉽고 빠르게 (삽입 및 삭제 포함) 업데이트에있는 테이블에 정규화 리드. 정규화는 업데이트 이상을 미연에 방지하고, 모순 자체에있는 데이터베이스의 possiblity가를 제거한다. 이것은 그들이 불가능하여 버그의 전체를 많이 방지 할 수 있습니다. 그것은 또한 그들이 필요하여 업데이트 병목 현상의 전체를 많이 방지 할 수 있습니다. 이것은 좋다.

    설계 원칙의 다른 세트가있다. 그들은 덜 완전히 정상화보다 테이블 설계로 이어집니다. 그러나 그것은 "비정규"아니다. 그것은 정상화에 다소 호환되지 않는 단지 다른 디자인입니다.

    정상화에서 근본적으로 다른 디자인을 리드 스타 스키마 디자인입니다 디자인 원칙 중 하나 개입니다. 스타 스키마는 쿼리에 대해 매우 빠릅니다. 심지어 대규모 조인 및 집계는 좋은 DBMS, 좋은 물리적 설계, 충분한 하드웨어가 작업을 완수하기 위해 주어진, 적절한 시간에 수행 할 수 있습니다. 예상 할 수 있듯이, 스타 스키마는 업데이트 이상을 겪고있다. 당신은 당신이 최신 데이터베이스를 유지하는 경우 이러한 이상을 주위에 프로그래밍 할 수 있습니다. 당신은 일반적으로 엄격하게 통제하고 신중 내장 ETL 프로세스가 필요합니다 업데이트 다른 (아마도 정규화) 데이터 소스에서 스타 스키마.

    스타 스키마에 저장된 데이터를 사용하여 극적으로 쉽다. 그것은 OLAP의 어떤 종류를 사용하여 엔진을보고, 당신은 너무 많은 성능 저하없이 코드를 작성하지 않고 필요한 모든 정보를 얻을 수 있도록 간단합니다.

    그것은 좋은 정규화 된 스키마를 설계하는 좋은 다소 깊은 데이터 분석을합니다. 데이터 분석의 오류 및 누락이 발견되지 않은 함수 종속 될 수 있습니다. 이 발견되지 않은 FDS는 정상화에서 출발을 의식하지 못하는 발생합니다.

    또한 설계 및 좋은 스타 스키마를 구축하는 좋은 다소 깊은 데이터 분석을합니다. 데이터 분석에 오류 및 ommissions 치수 및 입도 불행한 선택 될 수있다. 이 빌드로 ETL 거의 불가능하게, 및 / 또는 새로운 요구에 부적절한 별의 용량을 운반하는 정보를 만들 것입니다.

    좋은 다소 깊은 데이터 분석은 분석 마비에 대한 변명해서는 안됩니다. 분석은 오른쪽 짧은 시간에 합리적으로 완료 할 수 있습니다. 작은 프로젝트에 대한 짧은. 설계 및 구현은 데이터 분석과 요구 사항에 약간의 후반 추가 및 수정을 살아남을 수 있지만, 요구 사항 개정하지 꾸준한 토런트한다.

    이 응답은 원래의 질문에 확장,하지만 난 데이터베이스 디자이너가 될 것이 관련 생각합니다.

  13. ==============================

    13.정규화는 품질 결정이다.

    정규화는 품질 결정이다.

    비정규은 성능 결정이다.

    그 이유 -

    품질 결정은 당신이 살 수있는 최소한 일반 양식 인 말씀 :

    성능 결정은 가장 높은 표준 양식이 허용 무엇인지 말해 :

    당신은 적어도 당신의 경우 가장 높은 표준 양식 허용 고정되면, 중간에 어디 일반 양식을 선택합니다.

  14. from https://stackoverflow.com/questions/496508/how-far-to-take-normalization by cc-by-sa and MIT license