일대일 관계가 정상화됩니까?


12

레코드에 대한 많은 통계 데이터 세트가 있다고 가정하십시오. 예를 들어 20-30 INT개의 열. 전체 세트가 하나의 레코드에 속하거나 일대일 관계로 연결된 다른 테이블을 작성하므로 전체 테이블 세트를 유지하는 것이 좋습니다.

전자의 장점은 JOIN해당 레코드의 모든 통계 데이터 를 피하고 빠르게 액세스 할 수 있다는 것입니다.

후자의 장점은 컬럼을 깔끔하게 유지하는 것입니다. 첫 번째 열은 읽기 집약적이고 두 번째 열은 쓰기 집약적입니다. 물론 InnoDB를 행 수준 차단과 함께 사용하므로 성능에 큰 영향을 미치지 않는다고 생각합니다.

일반적으로 단일 레코드에 대해 서로 다른 데이터 세트를 분리하는 것이 실제로 유용한 지 알고 싶습니다.


2
'정규화 된'은 첫 번째 정규형 (1NF)을 의미하며 관계형 모델의 기본 요구 사항입니다. '완전 정규화'는 5NF 이상을 의미합니다. 제안 된 '일대일 관계'테이블은 분해되기 때문에 현재 테이블보다 더 높은 정규 형식 (아마도 6NF) 일 가능성이 더 높습니다! 기존 테이블이 어떤 일반 양식을 만족합니까?
1

@onedaywhen 다른 많은 사람들처럼 정규화를 단계별로 따르지 않습니다. 때때로 비정규 화도 도움이됩니다. 일반적으로 전체 데이터베이스의 표준화 수준은 3NF-5NF 여야합니다 (항상 4NF에 문제가 있습니다!)
Googlebot

답변:


19

정규화 규칙에 맞으면 1 : 1 관계를 정규화 할 수 있습니다 (정의상!). 즉, 1 : 1 관계에 대해서는 정상적인 형태를 따르는 것이 불가능합니다.

1 : 1 관계의 실용성에 대한 귀하의 질문에 대답하기 위해, 이것은 독특한 술어 (열)를 가진 하위 유형이있는 경우와 같이 완벽하게 유용한 구문 인 경우가 있습니다.

1 : 1 관계를 사용하는 이유는 관점에 따라 다릅니다. DBA는 모든 것을 성과 결정으로 생각하는 경향이 있습니다. 데이터 모델러와 프로그래머는 이러한 결정을 디자인 또는 모델 지향적이라고 생각하는 경향이 있습니다. 실제로, 이러한 관점들 사이에는 많은 중복이 있습니다. 그것은 당신의 관점과 우선 순위에 달려 있습니다. 1 : 1 관계에 대한 동기 부여의 예는 다음과 같습니다.

  • 매우 넓은 열의 하위 집합이 있으며 성능상의 이유로 저장소에서 열을 물리적으로 분리하려고합니다.

  • 자주 읽거나 업데이트되지 않는 열의 일부 하위 집합이 있으며 성능상의 이유로 자주 사용하는 열과 구분하기를 원합니다.

  • 일반적으로 선택적인 일부 열이 있지만 레코드가 특정 유형임을 알면 필수입니다.

  • 하위 유형에 논리적으로 함께 속하는 일부 열이 있으며 코드의 개체 모델에 맞게 열을 모델링하려고합니다.

  • 엔터티 수퍼 유형의 일부 하위 유형에만 적용 할 수있는 열이 있으며 스키마에서 다른 하위 유형에 대해이 데이터가 없음을 적용하려고합니다.

  • 엔터티에 속하는 일부 열이 있지만보다 제한적인 액세스 규칙 (예 : 직원 테이블의 급여)을 사용하여 이러한 특정 열을 보호해야합니다.

따라서 때로는 드라이버가 성능이고 때로는 모델 순도이거나 선언적 스키마 규칙을 최대한 활용하려는 욕구를 알 수 있습니다.


You have some subset of columns that are very wide and you want to segregate them physically in your storage for performance reasons.이들을 분리하면 성능이 어떻게 향상됩니까 (기본 테이블이 열마다 항상 열에 액세스한다고 가정)?
길리

@Gili-귀하의 가정이 사실이라면이 경우는 적용되지 않습니다. 필요하지 않은 큰 열을 분리하면 더 많은 행을 페이지에 맞출 수 있으므로 일반적으로 사용되는 열을 더 빨리 검색 할 수 있습니다. 조인이 필요하기 때문에 일반적으로 사용되는 열과 함께 분리 된 열을 읽는 것이 느릴 것 입니다.
Joel Brown

디자인 이유 (문제 분리, 코드 재사용 증가)로 일반적으로 사용되는 열을 분리하고 싶습니다. 누구든지 그러한 조인 비용을 추정 했습니까? 무시해도 좋거나 장기적으로 걱정해야 할 것이 있습니까?
길리

@Gili-re : 조인 비용 : "그것은 달려있다"는 것 외에는 그 질문에 대한 정답이 없습니다. 가입 비용은 많은 요인에 의해 영향을받습니다. 그들이 무시할 수 있는지 여부는 궁극적으로 주관적이기 때문에 대답하기가 더 어렵습니다. 질문에 대답하는 가장 좋은 방법은 일부 테스트 데이터를 모의하고 볼륨 테스트를 수행하는 것입니다. 두 가지 방법으로 시도하고 실제 데이터 볼륨을 사용하여 차이점을 알 수 있는지 확인하십시오 (응용 프로그램에 어떤 의미가 있는지).
Joel Brown

나는 놀라운 결과를 얻었습니다 : dba.stackexchange.com/q/74693/4719 나는 이것이 정규화의 전형적인 예는 아니라는 것을 인정하지만 JOIN이 (아직도) 매우 비싸다는 것을 강조하지는 않습니다.
길리

4

일대일 매핑을 사용하여 큰 테이블을 두 개로 나누는 주요 이유는 성능상의 이유입니다.

a) 테이블에 자주 액세스하는 테이블에 이진 / 클로브 / 블롭 데이터가 있으므로 큰 열이 다르게 처리되므로 성능이 저하됩니다.

b) 테이블에는 다른 쿼리로 액세스되는 많은 열이 있으므로 성능이 저하되므로 관련 열을 별도의 테이블로 이동하여 액세스 성능을 향상시킵니다.

그러나 많은 정수 열이 있다고해서 테이블을 별도의 테이블로 나누고 쿼리해야하는 추가 노력이 정당화되는 것은 아닙니다.


문제를 명확하게 설명 할 수있는 아주 좋은 점
Googlebot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.