2010-09-20 41 views
0

我正在使用LAMP網絡應用程序,它使用不同的度量單位管理大量數據。這個php應用程序使用一個自定義的MVC框架。我們現在有不同國家的客戶,我們希望爲客戶提供公制,英制或組合的選擇。如何在PHP Web應用程序中管理度量單位?

目前,所有數據都以國際單位保存在我們的MySQL數據庫中。一些表格有多列包含不同單位的數據。管理客戶(用戶)所選單元中所有數據的顯示的最佳DB架構是什麼?

是否有任何PHP類,PHP函數或Web服務可以幫助我們?

謝謝!


UPDATE:

如果我決定使用UnitConverter像Zend框架類,這將是確定的單位,我有我的數據庫中的每個數據的最佳方式是什麼?

  • 新表「measurement_unit」包含每個數據類型,我在我的數據庫中有測量類型?
  • 我應該在數據庫中添加一個新的「measurement_type」列嗎?
+1

嚴格遵循MVC框架,您可能需要一個名爲measurement_units的新表,其中包含type_id和type_name。然後,您的user_pref(或user)表中將會有一個measurement_type列。在該列中,您將存儲用戶的type_ids。這樣你的所有數據都在數據庫中。但是,由於測量類型數量非常有限,而且您不可能經常更改它們,所以我只需在庫中定義測量類型(define('METER',1);)並存儲一個字符串(' METER')放在user_pref(或user)表的一個measurement_pref列中。 – clumsyfingers 2010-09-21 12:31:10

+1

在上面的第一個更具可擴展性,而第二個更高效的速度。我還會注意到,如果您想將您的框架移動到另一個項目中,首先您需要將您的measurement_units表和您的庫一起移動,並且在移動時它可以獨立運行。哦,你也可以將你的定義保存在模型或配置文件中,這可能是最好的解決方案。如果將其保存在全局配置中,可能需要使用前綴命名空間。 – clumsyfingers 2010-09-21 12:39:17

+0

感謝您的回答!爲我的應用程序中每個數據保存測量單位的最佳方法是在user_pref表的單個「measurement_type」列中保存測量單位的最佳方法是什麼?在我的應用程序中聲明每個數據的度量單位的最佳方式是什麼,而不會過度添加具有太多列的模式? – benjisail 2010-09-22 10:14:25

回答

4

問題的解釋有點模糊,我不知道該應用程序的範圍,但是從系統架構來看,如果您正在使用MVC框架,您可能希望保持所有數據庫單位相同並創建一個UnitConversion控制器。該控制器將採用標準單位作爲輸入,並根據所需單位輸出一個值。您的用戶/客戶端記錄中會保留一個標誌,讓您知道他們喜歡哪個單位,這樣您就不會在登錄之間丟失這些信息。將標準單位格式的值(比如米)和所需單位的標誌(比如'FEET')傳入控制器,讓它進行轉換並返回一個值。

我不會嘗試在數據庫中保留不同的單元類型,因爲您可能最終會編寫各種代碼來嘗試管理異常和維護(例如,在客戶端更改其單元時更新所有值)。在數據庫中保留一個標準單元,並通過類似於Robert提到的Zend框架的php類來完成轉換。谷歌搜索「PHP單位轉換」將帶來一些可能滿足您的需求的類。

ON UPDATE:

仍不能確定我看到了整個問題,但我會盡力回答是最好的,我明白了。像以前一樣,最好在數據庫中保留1個單位系統,比如說,度量。 user_pref中的measurement_type告訴客戶想要什麼,說'IMPERIAL'。這取決於如何攤開你的數據庫是你可以選擇兩種解決方案之一保存值:

  1. 對於您的數據庫項目,你可能有不同的屬性(列),如體重,身高,體積等

  2. 您可能有一個包含項目的項目表。然後你有一個擁有屬性的Property表。屬性表有4列:property_id(主鍵),屬性(HEIGHT,WIDTH,LENGTH,WEIGHT),property_type(SIZE,MASS,VOLUME,AWESOMENESS)和值。然後你有一個Property_Lookup表,它有兩列:item_id,property_id和這三個表之間的連接將給你屬於一個Item的每個屬性的所有值和單位類型。在這個模式中,我仍然保留單個單位系統中的'值'列中的所有條目(在此示例指標中)。有關多對多關係的更多信息,請參閱此鏈接(http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php)。

您的模型將檢索數據並將這些屬性封裝在Unit {system(METRIC *,IMPERIAL,BOTH);類型(尺寸,質量,體積);價值}迷你型號。把它傳給你的控制器。在呈現您的視圖時,您會希望基於客戶端所需的單位值,因此,當您的控制器將視圖的數據放在一起時,它將通過UnitConversion庫發送單元對象。 UnitConversion庫將檢查客戶端首選系統的用戶模型和單元模型中的「系統」,並進行必要的轉換(因爲庫可以假設來自數據庫的單元模型中的系統是度量標準,所以它使步驟更簡單)。然後,它將以正確的單位輸出一個數字(如果選擇BOTH,則爲單位),這可以傳遞給視圖。

上面的一句話是,總是在系統架構中處理問題時沒有「正確」的解決方案。這就是我如何根據所提供的信息來組織事物的方式,但是您可能需要對它進行相當程度的調整才能使其與您正在處理的內容完全吻合。也就是說,我會調整上述內容以適應您的系統,而不是調整您的系統以實現上述功能!希望這給你一些好點子。

+0

謝謝,這是我的問題的PHP方面的一個很好的答案。現在我只需要在數據庫方面提供一些幫助。 – benjisail 2010-09-21 08:54:39

+1

「控制器」不是所用類的類型,但「庫」會更合適 – RobertPitt 2010-09-21 09:12:34

2

請看一看了Zend組件Zend_Measure

+0

我已經有了一個我不想更改的自定義MVC框架。但是,除了框架之外,我可以使用Zend Framework作爲大型庫嗎?就像那樣,我可以直接使用Zend_Measure組件。 – benjisail 2010-09-21 11:35:09

+1

如果你的PHP安裝了Zend Framework,你可以執行'Require_once'Zend/Loader.php';'然後跟着'Zend_Loader :: loadClass('Zend_Measure');'這會加載你需要的文件Zend Measure類! – RobertPitt 2010-09-21 11:43:08

相關問題