2011-10-04 3 views
0

실제 질문을 작성하는 데 어려움을 겪고 있습니다. 따라서 시각 보조 도구를 통해 요점을 얻을 수 있습니다.MySQL - 열 참조 최적화?

현재 데이터베이스 디자인에 끔찍한 결함이 있는지, 약간 비효율적인지, 또는 올바른지 여부는 궁금합니다.

Q : 행 셀이 다른 테이블의 열을 참조하는 더 좋은 방법이 있습니까? 그 열 이름의 문자열을 저장하는 것 외에 다른 방법이 있습니까?

예 : 두 개의 표가 있습니다.

table01 : 3 열이 - C_ID, 고객, 계층을

table02 (계층이 table02에있는 계층의 열 이름을 보유) : - i_id, 항목, tier1, tier2, 계층 3

5 열이
table01 +------+----------+------+ 
     |'c_id'|'customer'|'tier'| 
     +------+----------+------+ 
     | 1 | John  | tier1| 
     | 2 | Lisa  | tier2| 
     | 3 | Mike  | tier1| 
     | 4 | Tom  | tier3| 
     +------+----------+------+ 

table02 +------+------+-------+-------+-------+ 
     |'i_id'|'item'|'tier1'|'tier2'|'tier3'| 
     +------+------+-------+-------+-------+ 
     | 1 | apple| $1.99 | $2.99 | $3.99 | 
     | 2 | chalk| $2.99 | $3.99 | $4.99 | 
     | 3 | pens | $3.99 | $4.99 | $5.99 | 
     | 4 | shirt| $4.99 | $5.99 | $6.99 | 
     +------+------+-------+-------+-------+ 

결과 :

John +------+-------+ 
     | apple| $1.99 | 
     | chalk| $2.99 | 
     | pens | $3.99 | 
     | shirt| $4.99 | 
     +------+-------+ 

tier1을 얻을 것이다 요한의 행을 선택하는 그런 다음 table02.tier1을 쿼리하고 해당 열의 내용을 가져 오는 데 사용됩니다. (tier1 고객의 할인 가격에서). tier1 항목은 올바른 가격으로 표시됩니다.

외부 테이블의 열 이름을 참조하는 더 효율적인 방법이 있습니까? 예를 들어 외래 키 스타일입니까? 열 이름이 변경되면 해당 정보가 다른 연결된 데이터 셀로 이동됩니까? 내 접근법이 맞습니까? 아니면 내가 어떻게 작동하는지 재구성해야합니까?

+0

'table02'의'i_id'가'table01'의'c_id'와 합류 했습니까? 그렇지 않다면,'table02'의 어떤 행이'table01'의 행과 관련이 있는지 어떻게 결정합니까? –

답변

1

IT는 c_idi_id 열을 사용하는 가정하는 방법을 완전히 명확하지 않다, 그러나보다 전통적인 디자인과 같은 디자인을 사용하는 것입니다 :

table01 +------+----------+------+ 
     |'c_id'|'customer'|'tier'| 
     +------+----------+------+ 
     | 1 | John  | 1 | 
     | 2 | Lisa  | 2 | 
     | 3 | Mike  | 1 | 
     | 4 | Tom  | 3 | 
     +------+----------+------+ 

table02 +------+------+-------+ 
     |'i_id'|'tier'|'cost' | 
     +------+------+-------+ 
     | 1 | 1 | $1.99 | 
     | 2 | 1 | $2.99 | 
     | 3 | 1 | $3.99 | 
     | 4 | 1 | $4.99 | 
     | 1 | 2 | $2.99 | 
     | 2 | 2 | $3.99 | 
     | 3 | 2 | $4.99 | 
     | 4 | 2 | $5.99 | 
     | 1 | 3 | $3.99 | 
     | 2 | 3 | $4.99 | 
     | 3 | 3 | $5.99 | 
     | 4 | 3 | $6.99 | 
     +------+------+-------+ 

내가 편집을 내 생각을 더 잘 예시하는 예. 정말 답을 많이 바꾸지 않습니다. 따라서 계층 열을 하나의 열로 통합하고 item id (i_id) 데이터를 여러 번 반복하는 것이 좋을까요? 계층/비용 구조를 열로 나누는 나의 논리는 중복성을 줄이는 것이 었습니다. 그 접근 방식은 외래 키에 대한 계층을 색인화하기 위해 새 테이블을 작성해야합니까?

나는 당신이 지금하고있는 일을 이해합니다. 이 라인의 어딘가에는 c_idi_id, 수량, 날짜 및 기타 정보 (각 판매가 하나의 항목으로 구성되어 있으면 그렇지 않은 경우 '주문'테이블이 있음)을 기록한 'Sales'테이블이있을 수 있습니다. 및 'OrderItems'로 표시되며 c_id은 주문 테이블과 연결되고 i_id은 주문 항목과 연결되며 두 테이블을 연결하는 주문 번호가 있습니다.

item 위의 수정 사항을 위의 수정 된 table02에 추가하면 3NF를 위반하게됩니다. i_iditem 열이있는 'Products'와 같은 테이블이 있어야합니다. 이렇게하면 항목 번호에 이름이 부여됩니다.내가 제안한 table02 (아마도 'TieredItemCosts') 테이블은 그대로 남아 있습니다. 기본 키는 (i_id, tier)의 조합입니다.

+0

예, 방금 예를 편집하여 내 생각을 더 잘 보여줍니다. 정말 답을 많이 바꾸지 않습니다. 계층 열을 하나의 열로 통합하고 item id (i_id) 데이터를 여러 번 반복하는 것이 좋을까요? 계층/비용 구조를 열로 분리 한 이유는 중복성을 줄이려했기 때문입니다. 외부 키에 대한 계층을 색인화하기 위해 새 테이블을 작성해야합니까? – Squish

+0

나는 당신이 수정 된 구조에 그것을 못 박았다고 생각합니다. HOW 관계는 실제로 간단합니다. C_ID는 고객입니다 ... 고객은 청구되는 가격 수준이 다를 수 있습니다 ... 대형 재판매 인은 과도한 할인을받을 수 있고 대개는 occaisional 판매자 대 임의의 직접 구매자 일 수 있습니다. 즉, "ITEM"(I_id)의 모든 제품은 고객에게 판매 될 수 있지만 계층 수준에서 고객은 "구매력"계약을 기반으로 할 권리가 있습니다. – DRapp

+0

@DRapp 정확히. 그래서 나는 관계를 어떻게 구성하는지 궁금해하고있었습니다. 현재의 접근 방식이 적절할까요 아니면 Jonathan의 접근 방식이 더 좋을까요? – Squish