2012-11-30 3 views
0

나는 db를 설계하고 있으며 앞으로 조건부 조인을 피하는 최선의 방법을 찾으려고 노력 중이다. 조건부 조인을 보여주는 기사를 읽었으며 가능한 경우 피하고 싶습니다.모델 디자인에 의한 조건부 조인 피하기

나는 CHECK 테이블을 가지고 있으며, CHECK은 데이터 (금액, 날짜 등)를 저장할 것입니다. 또한 3 개의 '기타'테이블이 있으며 VENDOR, VENDOR_DEPT, VENDOR_ACCOUNTVENDOR_ACCOUNT은 fk에서 VENDOR_DEPT까지이고 VENDOR_DEPT은 fk에서 VENDOR까지입니다.

내 문제는 이것이다 : 그 CHECK이 중 VENDOR, VENDOR_DEPT 또는 VENDOR_ACCOUNT에 할당 할 수 있도록 내 모델을 설계 어떻게 내 CHECK 테이블에 vend_id, vendacct_idvenddept_id을 가진 또는 열 check_id이있는 VENDOR_CHECK 테이블을하지 않고, vendor_level , join_id .... (잘하면 사진을 얻을 수 있습니다)

깨끗한 방법이 있습니까? BTW, 나는 MySQL을 사용하고 있지만 다른 플랫폼에서도 작동하도록 솔루션을 원합니다. 내가 모델 설계 단계에있어 이후

, 나는 물론이 테이블을 재 설계를 포함한 모든 제안 :

+0

왜 수표가 항상 공급 업체 계정과 연결되어 있지 않은지, 부서 및 공급 업체를 파생시킬 수 있습니까? –

+0

필요에 따라 사용자가 특정 부서가 아닌 전체 공급 업체에 수표를 추가 할 수 있기를 바랍니다. 일부 공급 업체는 너무 작아 부서 또는 acct 존재하지 않을 수 있습니다 ... 다른 테이블 이름을 상상해보십시오 : 프로젝트 - 할당 - 작업 (그리고 그들은 계층 구조에 상상 : Proj는 0 이상의 과제가 있고 과제는 0 개 이상의 과제를가집니다) if 프로젝트에 속한 '비용'항목이 있었으므로 작업 수준의 비용과 다르게 표시해야합니다. – NEW2WEB

답변

1

당신은 SQL의 관계 "하나의"구현하려는 개방적이야. 이러한 유형의 관계는 다소 어려울 수 있습니다. 나는 그것을 해결하는 "관계형"방법은 당신이 실제로 CHECK_ENTITY를 가지고 있으며,이 엔티티가 세 가지 유형 중 하나 일 수 있다고 가정합니다. 그러나 불필요하게 번거로워 보인다.

하나의 제안은 테이블에 3 개의 다른 열을 갖는 것입니다. 제 생각에는보고 목적으로 vend_id를 자주 사용하려고합니다. 주어진 CHECK에 적합한 것을 채우기 만하면됩니다.

그렇습니다. 따라서 vend_id가 CHECK 테이블과 VEND_ACCT 테이블에 모두 있기 때문에 데이터가 비정규 화됩니다. 계정과 부서가 변경되면 CHECK 시점에 관계를 포착합니다. 원하는 관계 일 수 있습니다.

대체 옵션은 "전체 공급 업체"를 의미하는 더미 계정을 갖는 것입니다. 그런 다음이 값을 전체 공급 업체를 의미하는 것으로 사용하십시오. 마찬가지로 각 부서의 계정이 필요합니다.

이 접근법에는 몇 가지 규율이 필요합니다. 가능한 한 깊이있는 공급 업체 계층 구조를 설정하고 부모 (계정 -> 부서 -> 공급 업체, 그래서 일반화하지 않는 이유)를 연결하는 것이 좋습니다. SQL은 관계 중 하나보다 계층 적 쿼리에서 더 나쁩니다. "악화"란 말은 이러한 쿼리를 처리하는 방법이 데이터베이스에 매우 의존적이라는 의미입니다.

+0

고든, 환상적인 응답. 고맙습니다! 나는 가짜 계정 아이디어를 좋아한다. 물론 이것은 여전히 ​​db에 대한 단일 호출 이상을 만들 필요가 있거나 내 데이터를 얻기 위해 외부 조인을 사용해야 할 것임을 의미한다. – NEW2WEB

관련 문제