2016-07-15 2 views
2

결합/접합 테이블에 추가 데이터를 저장하는 데 단점이 있습니까? 예를 들어, 내가 트럭 운송 회사의 데이터베이스에서 일하고 내가 3 개 테이블이SQL join/junction 테이블에 추가 데이터를 저장해야합니까?

:

Table 1 - company, 
Table 2 - trailer_type, 
Table 3 - junction_table, 

각 회사는 하나 개 이상의 트레일러 유형을 가질 수 있지만, 또한 각각의 트레일러 형 트레일러의 수를 필요 회사마다. 예고편을 집어 넣는 가장 논리적 인 장소는 company.id 및 trailer_type.id가있는 교차점 테이블에있는 것처럼 보입니다.

이렇게하는 데 단점이 있습니까? 그렇다면 더 좋은 방법이 있습니까?

+0

이 데이터를 데이터베이스에 저장하지 마십시오. 쿼리를 사용하여 회사 당 계산 수를 계산하십시오. – Siyual

+0

이 시점에서 쿼리는 회사에서 보유하고있는 "각"트레일러 유형의 수를 포함하는 데이터를 저장하는 가장 좋은 방법을 결정할 때 회사에서 보유한 "다양한"트레일러 유형 만 반환합니다. – zcleft

답변

3

당신이 질문을 표현한 방식에서 나는 당신의 직감이 대부분 정확하다고 생각합니다. 접합부 테이블을 카운트 유지 장소로 확인했습니다. 하지만 "접합점 테이블"이기 때문에 당신은 주저하고 있습니다.

모든 테이블이 동일하게 생성됩니다. SQL의 관점에서는 사실 테이블, 차원 테이블, 접합 테이블이 없습니다. 테이블 만 있습니다.

정규화 된 디자인은 각 행을 식별하기위한 최소 키를 나타냅니다. 귀하의 경우, 접합 표의 자연 키는 {company_id, trailer_type_id}와 유사합니다. 해당 키에 기능적으로 종속 된 정보가 있습니까? 왜, 예, 있습니다 : ntrailers. 따라서 기둥이 탄생합니다.

그래서 어떤 테이블인지 걱정하지 마십시오. 행 을 의미하고 어떻게 식별되는지 생각해보십시오. 그것은 당신을 페어웨이에 유지합니다.

0

먼저 접합부 테이블에 추가 정보를 저장하는 것이 좋습니다. 예를 들어, 생성 된 날짜는 종종 매우 흥미 롭습니다. 그리고 고객이 청구서에 연결하는 청구 레코드와 같이 접합부 테이블로 생각할 수있는 엔티티의 많은 예가 있으며 레코드에는 자연스럽게 추가 필드가 있습니다.

그러나 카운트는 일반적인 상황에서 저장하는 것이 아닙니다. 이 유형의 정보는 Company 테이블에 있어야합니다 (특히 시간이 지남에 따라 수정 된 경우).

수정되지 않은 경우 두 가지 옵션이 있습니다. 첫 번째는 천천히 변화하는 차원으로, 회사의 예고편 수와 유효 기간 및 종료일을 저장합니다. 실행 가능한 대안은 junction 테이블에 값을 저장하는 것입니다. 첫 번째 선택은 아니지만 여러 상황에서 좋은 해결책이 될 수 있습니다.

+0

트레일러 유형별로 카운트가 필요하고 (Siyual의 의견에 따르면) 각 트레일러 별 기록이없는 경우 '회사'에 직접 저장하는 것은별로 의미가 없습니다. – Uueerdo

+0

감사합니다. @Gordon이 내 질문에 대답합니다. 내 시나리오에서는 회사가 25 개의 A 형 트레일러, 30 개의 B 형 트레일러 등을 보유 할 수 있으므로 10 개 이상의 트레일러 유형을 이야기 할 때 회사 테이블에 많은 추가 열이 있고 카운트는 많은 리던던시가 될 것입니다. – zcleft

+0

@Uueerdo 당신이 틀립니다. – zcleft

0

기업과 트레일러 간의 다 - 대 - 다 관계보다는 스키마를 조금 다르게 생각할 수 있습니다. 이것이 바로 접합 테이블이있는 이유입니다.

  1. 회사는 트레일러와 일대 다 관계를 가지고
  2. 트레일러 TrailerDescriptions와 대일 관계를 가지고 : 그것의 생각이 방법에 대해 어떻게

    .

    company_id 
    trailer_description_id 
    count 
    etc. 
    

    당신은 심지어 "수를"열을 추가하고 설정하여, 각각의 트레일러를 열거하도록 선택할 수 있습니다

    trailer_id 
    company_id 
    trailer_description_id 
    count = 1 
    date_placed_in_service 
    license_plate_number 
    
    1. :

그래서, 당신의 예고편 테이블이 컬럼이있을 것이다

관련 문제