2011-10-17 15 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

通常最好的做法是保持表格結構相同,並且只添加行以滿足您所示的情況。 (有原因,如優化,你可以偏離這個)

我會建議在查找「第三範式」,如果你的數據庫遵守的規則是在第三範式然後,你通常結束了很少的維護和更容易延伸到賽道上。

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這是正確的方法,但爲什麼麻煩包括狀態= N的行呢?只是省略它們。 –

+2

@吉姆加里森,我不完全確定Y/N究竟表明什麼,所以寧可做一個假設,爲了這個例子我將它們包含在內。但如果它是我期望的啓用類型標誌,那麼你是正確的,它可以全部省略 – bumperbox

0

如果您想避免添加列,您可以添加第二個以priceID和Country爲列的表,並刪除所有國家列。然後,您只需使用priceID具有引用第一個表中的ID的外鍵,並且可以根據需要添加新的國家/地區。

0

是的,我會這麼說。你的目標將是找到一個給定的重量和國家組合的價格,所以它應該很容易執行此查詢:

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

而且您的架構允許輕鬆。我建議你選擇to_weight,使得499.9的值適合其中一個類別,除非權重限制爲一個整數。我不擔心添加新列,這很容易,你可以將它默認爲任何新國家的假。

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