2013-07-24 138 views
0

我正在努力一點存儲數據的最佳方式 - 直接來自用戶的「原始」數據與需要翻譯的「編碼」數據。下面是說明其中測量患者的血壓選擇列表中的一個具體的例子:數據存儲爲VARCHAR與INT,「翻譯」服務器端與客戶端

<select id="location"> 
<option value="1">Office</option> 
<option value="2">Home</option> 
<option value="3">Hospital</option> 
<option value="4">Work</option> 
<option value="5">Other</option> 
</select> 

在過去,我會作出存儲變量的VARCHAR,只是保存它作爲全部小寫的「辦公室」,「家「,」醫院「,」工作「,」其他「。但在過去一個月中,我一直在想,也許更「優雅」的方法是將其存儲爲整數「代碼」(如上面的示例中所示),然後在從表中讀取時翻譯它,如此服務器端翻譯:

$location=$row['location']; 
    if ($location == '1') {$location = "Office";} 
    else if ($location == '2') {$location = "Home";} 
    else if ($location == '3') {$location = "Hospital";} 
    else if ($location == '4') {$location = "Work";} 
    else if ($location == '5') {$location = "Other";} 

所以,我的小白問題,你有點哲學 -

  1. 你總是/ SOMETIMES存儲數據的「原始」 VARCHAR數據,還是你的「代碼」與整數/布爾等?你有做標準嗎?

  2. 如果您對數據進行「編碼」,您是否在服務器端或客戶端「解碼」它?

我事先感謝您的想法。

回答

0

答案是:magic numbers都不好。你在任何情況下都不應該在你的代碼中使用if ($foo == 4),因爲,簡而言之,WTF確實是「4」嗎?

如果在所有爲此目的而使用常量:

define('HOSPITAL', 4); 

if ($foo == HOSPITAL) ... 

這不是一半壞,因爲你不與底層意義的價值直接取得聯繫了。如果您曾經需要調試應用程序,那麼您將在任何地方看到該值,包括數據庫。 ENUM在這裏很有用,但PHP不支持它們。數據庫雖然。因此,一個妥協是在PHP中使用ENUMs數據庫和常量:

CREATE TABLE foos (
    foo ENUM('hospital', 'office', ...) 
); 

define('HOSPITAL', 'hospital'); 

if ($foo == HOSPITAL) ... 

這給了你:

  • 類型安全並減少在數據庫中存儲
  • 類型安全和微創更高效的處理in PHP
  • 寫入和調試代碼時全部清晰
+0

oooooooooooooo ooooooh ...光剛剛熄滅!我認爲單個整數的存儲效率會更高,但根據您的第一條評論,我猜不是。幸運的是,我的頁面上只有6個「幻數」,我可以更改爲枚舉類型。謝謝!謝謝!謝謝! 「幻數不好」「幻數不好」「幻數不好」「幻數不好」「幻數不好」 - :-) – TimSPQR