9

일치하는 클라이언트와 서비스에 대한 모델을 고려하십시오. 고객은 다양한 시간에 서비스 제공자와 서비스 소비자가 될 수 있습니다. 고객은 개인 또는 그룹 (회사) 일 수 있으며 후자는 여러 연락처가 있습니다. 주소록에는 여러 주소, 전화, 전자 메일이있을 수 있습니다. 이러한 관계 중 일부는 일대일 (예 : 제공 업체에 대한 서비스)이지만 대다수는 일대 다 또는 다 대다 (여러 회사의 연락처는 동일한 주소를 가짐)입니다. 여러 연관 테이블이 일반적으로 존재하는 것이이 모델, 예를 들어, client_contact, contract_addr, contact_phone, CONTACT_EMAIL, SERVICE_PROVIDER, service_consumer에서 "마스터"연관 테이블?

주어진 서비스의 소비자를위한 연락처 정보에 대한 간단한 쿼리를 실행 말. 데이터가 들어있는 6 개의 엔티티 테이블 외에도 조인은 5 개의 연관 테이블을 참조합니다. 물론 이런 종류의 질의에 대해 특히 흥미로운 것은 없습니다. 우리는 매일 그렇게합니다.

그러나 나에게도 일어났습니다. 왜 모든 연관성을 지닌 단일 "마스터"연관 테이블이 없습니까? 이 마스터 테이블에는 두 개의 PK 외에도 "연관 유형"이 있고 모든 PK는 동일한 유형 (int, GUID 등)이어야합니다.

한편으로는 각 조인이 형식과 PK를 지정해야하므로 쿼리가 더 복잡해집니다. 반면에 모든 조인은 동일한 테이블에 액세스하고 적절한 인덱스 및 캐싱 성능으로 극적으로 향상 될 수 있습니다.

이 방법을 설명하는 패턴 (또는 패턴 방지)이있을 수 있지만 온라인에서 아무 것도 발견하지 못했다고 가정했습니다. 아무도 그것을 시도 했습니까? 그렇다면 확장 성이 있습니까?

제공 할 수있는 참조는 만족 스러울 것입니다.

+0

마음에 드네요. 위선적 인 생각이 들어요. 이건 정말 나쁜 생각인데 정확한 (기술적 인) 이유를 정확하게 지적 할 수는 없어요. 여러분은 여러분이이 설정에 대한 잠금 문제에 매우 취약하다는 것을 주장 할 수도 있습니다. 그리고 필요한 경우 다 대 다 관계에 메타 데이터를 실제로 추가 할 수 없습니다. 또한 적절한 RDBMS가 사용자가 언급 한 상황을 처리하기 위해 최적화되었다고 가정합니다. –

+0

그것은 내 생각이었습니다. 그래서 나는 적어도 CRUD가있는 곳에서는 정말 나쁜 생각으로 문서화되지 않았 음을 알면 놀랐습니다. 나는 낮은 TX 볼륨으로 의심스럽고 쿼리가 낮은 격리 상태에서 살아갈 수 있다고 믿을 수 있습니다. 단일 "마스터"테이블이 더 나은 최적화를 가져올 수 있다고 가정했지만 특정 RDBMS에 따라 달라질 수 있습니다. 계획을 비교하는 것은 ("마스터"대 규칙적 assoc) 유익한 것입니다. – djhill8262

+0

형식이 키 또는 인덱스의 상위 부분이 될 것이라고 생각하고 있으므로 조인은 다음과 같습니다. Type = 'Type1'AND PK1 = PK2? 이 경우 성능이 실제로 더 좋을까요? –

답변

1

데이터웨어 하우징에서 팩트 테이블을 상기시켜줍니다. 필자가 알기로는 모든 다 대다 관계를 모델링 할 테이블이있는 일반적인 트랜잭션 스키마로 시작하는 것입니다. 그런 다음보다 쉬운 차원 분석을 위해 데이터를 재구성하려면 스키마의 일부/모든 관계를 각 열이 키인 하나의 넓은 테이블로 집계 할 수 있습니다. 이렇게하면 가능한 모든 조인을 효과적으로 수행하고이를 테이블로 덤프하여 쿼리 조인의 목적을 관계에서 엔터티의 속성으로 변경합니다.

어쨌든,이 물건에 대한 나의 이해는 불투명하고 내 경험은 효과가 없지만 어쩌면 당신의 아이디어는 다른 이름으로 사실 테이블이므로 조사하는 데 유용합니다.

+0

dacc에게 감사드립니다. 연구 할 패턴을 제공하고 다른 사람들을 이끌어 낼 수도 있습니다. 빠른 검색은 모기지 승인 및 제조 프로세스와 같은 응용 프로그램에 대한 "축적 된 스냅 샷"을 설명하는 스타 스키마 (웨어 하우징)와 관련된 여러 기사를 나타 냈습니다. 이것들은 내 모델과 유사하지는 않지만 패턴에는 약간의 유사점이 있으며 뷰를 별칭 (예 : 클라이언트, 연락처, 서비스 등)으로 사용하는 기술이 유용 할 수 있습니다. 나는 휴일에 시간을 좀두고, 그것이 어떻게 행동 하는지를보기 위해 함께 놓을지도 모른다. 감사! – djhill8262

0

우선, 당신은 분명히 유지 보수성에서 가격을 지불하고 있다고 생각합니다. 그런 "유형"열이있을 때마다, 나는 붉은 깃발이라고 생각합니다. 그것은 당신의 절차에서 마법의 문자열로 이어질 가능성이 보인다 - 타입이 삽입과 선택에 대해 일관성이 있는지 확인해야한다. 따라서 성능 향상은이 두통을 정당화하기에 충분할만큼 커야합니다.

둘째, 더 많은 데이터를 저장하는 데 비용을 지불하고 있습니다. 즉, 각 연결에 대한 추가 "유형"열입니다. 그런 다음 쿼리를 실행할 때이 데이터를 검색해야합니다.이 데이터는 한 번에 메모리에있을 수있는 행 수에 영향을 미칩니다.

셋째, 각 쿼리는 여러 테이블 또는 하나에 저장되어 있는지 여부에 관계없이 동일한 총 행 수에 액세스해야합니다. 따라서 클러스터 된 인덱스를 만들 수있는 데이터에 대해 알지 못하는 경우 쿼리를 실행할 때 같은 수의 페이지를 검색하는 것일 수 있습니다.

넷째, 색인에 로그 동작이 있다고 가정하고 5log (N)이 log (5N)보다 크다는 것을 가정하면 성능이 향상 될 수 있으므로 5 개의 작은 색인보다 큰 색인을 사용하는 것이 좋습니다. 그러나 형식 열을 추가하면이 이점이 줄어 듭니다. 나는 그것을 완전히 없애 버릴 지 아니면 단지 그것을 줄이는지를 어떻게 분석 할 지 잘 모르겠습니다.

다섯째, 적어도 일부 쿼리의 경우 마치 거대한 테이블의 여러 복사본에 합류하게 될 가능성이 매우 높습니다. 실제로이 스크립트는 킬러가 될 것으로 보입니다.

나는 어떤 결과를 얻는 지 알고 싶지만, 성능상의 이점이 있다면 놀랄 것입니다.

0

이것은 추상화 및 테이블 상속을 통해 해결할 수 있습니다.

개별 클라이언트, 조직 클라이언트, 서비스 공급자는 역할을 수행하는 모든 당사자입니다.

전자 메일 주소, 전화 번호, 웹 주소 및 실제 주소는 모두 주소입니다.