2013-10-21 38 views
4

我知道我的問題看起來有點模糊,但我覺得管理國家/地址實際上是很常見的事情,所以我想在我的實際設置上得到一些建議。如何管理數據庫中的國家

我有一個數據庫與「國家」一欄,以前是一箇中等的int類型,作爲外鍵到另一個表與有關國家(ID,姓名和ISO3166-1α-2碼爲主)的實際信息。

經過一些測試和基準測試之後,我最終將所有國家/地區的信息都放在了php文件數組中,而不是在需要時包括/需要它,它比查詢數據庫快一到兩個數量級。 (他們是278個國家)。

所以顯然這是一個更好的方法,但我覺得有什麼不對勁,因爲人們通常傾向於從表格中讀取這種東西,而不是從文件中讀取,但我無法弄清楚它會是什麼,是它嗎?更容易維護或類似的東西?

此外,我正在考慮將2個字母的ISO代碼作爲關鍵字而不是數字ID,它會更具人性化,無論如何它們都是唯一的。我在400.000行表中看不到明顯的性能損失,如果我的數據庫增長,最終會出現錯誤嗎?

+1

你是如何查詢數據庫的國家表 - 有一個加入選擇,或兩個單獨的選擇?你在外鍵列上使用索引了嗎? –

+1

並且您是否爲國家/地區表設置了主鍵?您是否在每個1000循環中需要PHP國家/地區文件,或者需要一次,然後在同一個PHP處理器調用期間創建1000個短循環? –

+0

是的列被索引,實際上它既不是一個連接也不是兩個選擇。我用它作爲WHERE子句中的條件,如下所示:'SELECT * FROM table where country = 253',即使如此也需要更快的文件。我需要一次文件然後循環播放。 – aleation

回答

2

一般來說,你想把東西放在一起,一起改變。因此,如果您的主要數據存在於SQL數據庫中,將國家/地區數據保存在數據庫中有助於避免像更改PHP查找數組那樣瘋狂,而不會意識到SQL數據庫中存在大量數據。

它還有助於避免重複 - 如果爲系統構建第二個應用程序(例如管理系統),則最終不會得到2個國家/地區查找PHP文件副本。同樣,重複會爲錯誤創造機會,開發人員會更改數據庫和其中一個查找文件,但不會更改其他文件。

所有這些都相當防守 - 但應用程序傾向於以意想不到的方式發展,並且避免錯誤通常是一個好主意。

根據我的經驗,使用兩個表之間的連接幾乎沒有可衡量的性能影響,您可以使用提到的數字對調整良好的系統進行性能影響 - 在將查找移到PHP之前,您是否優化了SQL?

+0

是在測試之前對錶進行了優化。在@ mas.morozov指出了我犯的一個重大錯誤之後,我做了一些更多的測試,從文件中讀取性能仍然更好,但是我明白了你的觀點,如果項目擴展,從數據庫維護國家更容易,而無論如何,性能收益幾乎不會引人注目。所以我想我最終會保留數據庫中的國家,但是將ISO CODE作爲外鍵而不是數字ID。 – aleation