2014-02-07 3 views
3

데이터베이스를 정규화하거나 복합 유형 및 배열을 사용하는 경우에 대한 지침이 있습니까?복합 유형 및 배열을 언제 사용하고 언제 데이터베이스를 정규화합니까?

배열 및 복합 유형을 사용할 때 하나의 테이블 만 사용할 수 있습니다. 또한 데이터베이스를 정규화하고 몇 가지 테이블과 조인을 사용할 수 있습니다.

어떤 옵션이 가장 적합한 지 어떻게 결정합니까?

답변

6

대부분의 경우 표준화를 고수하십시오. 무엇보다도 데이터베이스를 상당히 정상적으로 유지하면 잠금 세분성이 향상됩니다. 예를 들어, 두 개의 배열이있는 "상위"개체가있는 경우 배열 구성원을 동시에 추가/업데이트/수정하는 트랜잭션을 수행 할 수 없습니다. 규칙적인 보조 테이블이라면 그렇게 할 수 있습니다. (자식 개체를 업데이트하기 전에 SELECT ... FOR UPDATE 부모 행 여전히 수 있습니다. 직렬화 된 동작을 원하는 경우).

PostgreSQL은 전체 튜플을 다시 써야하므로 값을 추가/바꾸기/삭제하기위한 배열을 업데이트하는 것이 비쌉니다. 배열은 MVCC 업데이트로에 있습니다. (그것은 도움이 될 수있는 소매 위로 몇 가지 TOAST 트릭을 가지고 있지만 톤은 아닙니다.) 행에 포함 된 복합 복합 유형입니다.

배열과 합성물로 가득 찬 넓은 행은 일반적으로 사용되는 값의 느린 페치를 의미하는 느린 테이블 스캔을 의미합니다.

IIRC 외래 키를 복합 유형의 필드에 정의 할 수 없으므로이를 해결하거나 참조 무결성을 포기할 수 있습니다. 동감 배열 (거기 was work to get foreign keys to arrays to work하지만 나는 이제까지 comitted있어 생각하지 않습니다).

많은 클라이언트 드라이버 (PgJDBC, psqlODBC, psycopg2 등 등)는 배열 및 복합 요소에 대한 지원이 불완전하기 때문에 클라이언트 드라이버 상호 작용을 위해 튜플에 확장하는 경우가 많습니다. 복합 유형의 배열과 같은 일부 기능은 실제로 작동하기 매우 어렵습니다.

대부분의 ORM은 Hibernate와 같은 일반적인 것들을 포함하여 완전히 단순한 가장 낮은 공통 분모의 SQL 기능 이상을 사용하는 것을 완전히 망칩니다. 조만간, 누군가가 데이터 모델에서 그 중 하나를 가리 키기를 원할 것입니다. 그 시점에서 많은 울음 소리와 이빨이 찢어 질 것입니다. OTOH에서는 데이터 모델을 크게 개선하고 실제 문제를 해결하는 기능을 사용하지 않도록 가비지 ORM을 수용하지 마십시오. 예를 들어 네이티브 hstore 필드를 저장할지 EAV 스키마를 사용할지 선택하는 경우, jstore (또는 9.4에서는 json과 hstore 기능이 더 좋음)을 사용해보십시오.

(반대로, "객체 지향"프로그램을 가장 많이 사용하는 사람들은 도구가 빨기 때문에 가장 순수한 관계형 데이터베이스를 사용하는 경우가 많음).

보고서 생성 도구와 비슷하게 복합 및 배열과 유사하므로 DB를위한 정규화 된 모양을 제공하는보기를 만드는 경우가 많습니다. 그런 다음 ON INSERT OR UPDATE OR DELETE ... DO INSTEAD은보기를 트리거하여 쓰기를 가능하게합니다. 어느 시점에서 그것은 추악 해집니다.

개인적으로 뭔가를 "유형"으로 모델링하는 것이 논리적 인 경우 합성물을 보관하는 것이 좋습니다. 데이터 모델에서 원래 시간대의 타임 스탬프를 추적해야한다고 가정 해보십시오. 내장 된 유형이 없습니다 (아니요, 이름에도 불구하고 "시간대의 타임 스탬프"가 아니기 때문에 SQL위원회에 감사합니다). 따라서 (timestamp without time zone, tzname)을 저장하고 데이터 모델에서 일관되게 사용하는 복합 유형을 만들 수 있습니다.

마찬가지로 쿼리를 많이 사용하는 경향이 있지만 데이터 모델에서는 그렇지 않습니다. 이는 성능을 위해 의도적으로 비정규 화하려는 경우 유용하지만 구체화 된보기 또는 유사한 방식으로 수행되는 경우가 많습니다. 주요 데이터 모델의 변경이라 할지라도 적절한 성능 검토를 기반으로 수행해야하는 일종의 작업입니다. 느린 작업을 모르는 "최적화"작업이 아닙니다.

+0

감사합니다. 정규화에 대한 대부분의 이야기에서 배열이나 복합체에 대해 언급하지 않았으므로 너무 새롭고 나쁜 생각인지 궁금했습니다. 그러나 ORM과 배열 및 복합체를 지원하지 않는 도구를 잊어 버린 경우에는 복잡한 것을 위해 사용하는 것은 여전히 ​​바람직하지 않습니다. – rve

+0

작성해 주셔서 감사합니다. 정말로 나를 도왔다! –

관련 문제