2017-01-30 1 views
-2

인용문을 만드는 응용 프로그램을 개발 중입니다. 먼저 비용 분담 (또는 계산)을하고 그 결과에 따라 견적에 품목을 추가하십시오. 문제는 제가 제품이 많기 때문에 제품의 각 카테고리는 자체 매개 변수가 다른 매개 변수로 채워지는 형식을 갖게 될 것입니다. 비용 분율에 대해 하나의 테이블 만 있다면 거대합니다 테이블의 필드 수). 나는 이것이 올바른 접근 방식이 아니라고 느낀다. 그래서 아래 그림 내놓았다 :하나의 외래 키를 여러 테이블 (기본 키)에 연결

My diagram

이 솔루션도 가능, 또는 내가 "N"을 가지고 있어야합니다 각각의 비용을 무너 뜨리는 테이블의 다른 FK (나는 ​​N 테이블이있는 경우)? 더 나은 해결책이 있습니까?

내 연결 테이블 "Quotation_QtnDetail"이 필요한 경우 다른 질문이 있습니까?

+0

모든 계산 테이블에 대해 1-1 관계가있는 다른 테이블을 사용하십시오. 이 테이블을 외래 키의 기본 키 테이블로 사용하십시오. 1-1 관계에있는 많은 테이블을 연결하는 것은 쉽지만 1-m 관계에는 연결하지 않습니다. –

답변

0

CalculationType 열에 관련 레코드의 ID가 포함 된 일반 참조 ID 열과 함께 해당 레코드가 들어있는 테이블을 나타내는 열을 지정하면 이러한 테이블 중 하나에 특정 값에 대한 참조를 저장할 수 있습니다. . 예를 들어, CalcId123과 CalculationType이 2 인 경우 Calc2 테이블에 ID 123 인 레코드를 가리 킵니다.

이렇게하는 것의 단점은 FK 제약 조건을 사용하여 데이터의 유효성을 검사 할 수 없게되고 계산 테이블에 대한 조인이 조금 더 복잡해집니다.

Quotation_QtnDetail 테이블의 경우 레코드를 여러 Quotation 레코드에 연결할 수없는 경우이 여분의 연결 테이블이 필요하지 않습니다. 대신 QtnId 열을 QtnDetail 테이블에 추가하여 직접 연결하면됩니다. 마찬가지로 항목이 단일 계산 레코드에만 연결되어있는 경우 Calc_QtnItm 테이블을 제거 할 수도 있습니다.

+0

고맙습니다. 귀하의 솔루션을 CalculationType과 함께 사용하겠습니다. 하지만 SQL 쿼리로 어떻게 관리 할 수 ​​있습니까? CASE 문을 사용합니까? – Urban

+0

해야 할 일에 달려 있습니다. 모든 테이블을 왼쪽으로 합칠 수 있습니다 (예 : LEFT JOIN Calc1 ON Calc1.CalLinkId = Calc_QtnItm.CalcId AND Calc_QtnItem.CalculationType = 1). 결국 많은 NULL 값을 선택하게되거나 응용 프로그램에 별도의 쿼리를 수행하게 할 수 있습니다. Calc_QtnItem.CalculationType에 따라 관련 테이블에서 calc 정보를 가져옵니다. – Sam

관련 문제