2011-10-17 2 views
2

사용자가 상품에 배송 가격을 지정하는 시스템을 만들려고합니다. 내가 다루어야하는 변수는 체중 밴드 (그램에서 그램), 가격 및 적용 국가입니다. 이 데이터를 통해 고객 국가 및 바구니의 총 무게를 참조하여 운송비를 계산할 수 있습니다. 계획이 점점 더 많은 국가 옵션을 추가하는 것입니다 그러나미래에 많은 열이 추가 될 MySQL 테이블에 운송 가격 저장

id  from_weight to_weight price us ca gb fr es de it 
------------------------------------------------------------------ 
1  0g   499g  1.99 Y Y N N N N N 
2  500g  999g  2.99 Y Y N N N N N 
3  1000g  1999g  4.99 Y Y N N N N N 
4  2000g  2999g  7.99 Y Y N N N N N 
5  0g   499g  4.99 N N Y Y Y Y Y 
6  500g  999g  6.99 N N Y Y Y Y Y 
7  1000g  1999g  9.99 N N Y Y Y Y Y 
8  2000g  2999g  14.99 N N Y Y Y Y Y 

:

내 첫번째 생각이 같은 것입니다. 이는 매번 더 많은 열을 추가하는 것을 의미합니다. 이런 종류의 데이터를 구성하는 가장 좋은 방법입니까? 다른 제안 사항

+0

당신은 지금 그것을 가지고 있고 나중에 열을 추가하는 방법으로 언제나 그것을 구현할 수있다. 새 열은 기본값 'N'으로 추가해야합니다. '아니요'라고 가정하고 사용자가 다시이 국가를 사용할 수 있도록합니다. 나는 그것을 위해 부울을 사용할 것이다. 내 생각에 더 쉽게 보입니다. – Biotox

답변

4

일반적으로 테이블 구조를 동일하게두고 예를 들어 설명하는 경우 행을 추가하는 것이 좋습니다. (여기에서 벗어날 수있는 최적화와 같은 이유가 있습니다)

데이터베이스가 3 차 정규형으로 규칙을 준수하면 "3 차 정규형"을 찾는 것이 좋습니다. 유지 보수가 훨씬 적고 트랙 확장이 용이합니다.

table1 
id | from_weight | to_weight | price 
1 | 0g   | 499g  | 1.99 

table2 
id | table1id | countrycode | status 
1 | 1  | us   | Y 
2 | 1  | ca   | Y 
3 | 1  | gb   | N 

는 데이터

select price from table1 
join table2 on table1.id=table2.table1id 
where countrycode='us' and status='Y' and 
300 between from_weight and to_weight 
+2

+1 이것이 올바른 접근법이지만 status = N 인 행을 포함하여 귀찮은 이유는 무엇입니까? 그냥 생략하십시오. –

+2

@ Jim Garrison, 나는 Y/N이 실제로 무엇을 나타내는 지 완전히 모르겠다. 따라서 오히려 예를 들어 그들을 포함 시킨다고 가정한다. 하지만 그것이 내가 기대했던대로 활성화 된 타입 플래그라면, 당신은 정확합니다, 그것은 전부 생략 될 수 있습니다 – bumperbox

0

열을 추가하지 않으려면 priceID 및 Country가 열인 두 번째 테이블을 추가하고 모든 국가 열을 제거하면됩니다. 그런 다음 priceID에 첫 번째 테이블의 ID를 참조하는 외래 키가 있고 필요에 따라 새 국가를 추가 할 수 있습니다.

0

예, 그렇습니다. 당신의 목표는 주어진 무게와 국가 조합에 대한 가격을 찾을 수있을 것입니다, 그래서이 쿼리를 수행하기 쉬워야한다 :

SELECT price FROM table WHERE $weight > from_weight AND $weight < to_weight AND $country; 

을 그리고 스키마 쉽게 것을 할 수 있습니다. 체중이 정수로 제한되지 않는 한 카테고리 중 하나에 499.9의 값이 들어갈 수 있도록 to_weight를 선택하는 것이 좋습니다. 새 열을 추가하는 것에 대해 걱정하지 않아도됩니다. 새 국가를 만들면 쉽게 기본값으로 설정할 수 있습니다.

0

그것은 관련 가격 책정 계획의 테이블 형태로 그룹의 행을 것을 조회 할 방법이다. 그렇다면 PricingPlan 테이블과 PlanDetail 테이블이 있어야합니다.

PricingPlan 
----------- 
PricingPlanId* PlanTitle 
---------------------------------------- 
1    planA for North America 
2    planB for EU 

PlanDetail 
---------- 
PricingPlanId* DetailId* FromWeight ToWeight Price 
------------------------------------------------------ 
1    1   0g  499g  1.99 
1    2   500g  999g  2.99 
1    3   1000g  1999g  4.99 
1    4   2000g  2999g  7.99 
2    1   0g  499g  4.99 
2    2   500g  999g  6.99 
2    3   1000g  1999g  9.99 
2    4   2000g  2999g  14.99 

세 번째를 PlanCountry 표는 당신이 (새로운 행이 예를 들어 경우, 해당 테이블에 추가됩니다 가격 책정 계획과 관련 할 새로운 국가 모든 열을 추가 할 필요가 없습니다 그래서 사용한다 당신은 멕시코가 planA에 포함되기를 원한다.) :

Country 
------- 
CountryCode* CountryName 
----------------------------- 
us   USA 
ca   Canada 
uk   United Kingdom 
fr   France 
es   Spain 
de   Germany 
it   Italy 

PlanCountry 
----------- 
PricingPlanId* CountryCode* 
--------------------------- 
1    us 
1    ca 
2    uk 
2    fr 
2    es 
2    de 
2    it 
1    mx     --- Mexico added for planA 
관련 문제