2013-07-03 52 views
1

像手機這樣的值,我們是否應該將其存儲格式化,或者在請求時將其格式化? 哪種性能更好?哪個更好,存儲格式化值,還是請求時格式化

在像巴西這樣的國家,我們有代碼55,城市代碼像11,但是我們有5或4位數加4位數的電話號碼,如: +55(11)9999-9999或+55(21) 9999-9999,存儲無格式值,少數國家,您的國家代碼有1,2,3或4位數字,因此請求格式化將變得困難! 存儲格式化後,我將使用更多的空間存儲,INT < VARCHAR。 但通過處理,我們只是拋出值來顯示。 如果我把它存儲爲數字,我必須有很多的IF來識別國家和格式,佔用空間很小但處理時間很長。

對不起,我的英語。

+0

這取決於,如果您的應用程序將在全球範圍內使用,那麼您必須在需要時保留原始值和格式,並且顯然有一點性能下降。否則,你可能會保持一種格式。 – mohkhan

+0

在像巴西這樣的國家,我們有代碼55 –

+1

我一直認爲你應該在演示中做 –

回答

5

那麼,考慮一個典型的現代桌面計算機可以做到每秒6或70億次計算。

數據應該以最好的格式存儲,用於完成數據庫中的工作:搜索,排序,比較。電話號碼可以潛在地以不同格式(例如「(800)555-1212」,「800-555-1212」「800 555-1212」,「8005551212」)的UI進入。允許像匹配這樣的不同功能幾乎決定了格式在存儲到數據庫之前將被剝離,然後在顯示時進行打印。

格式化電話號碼的處理器開銷很微不足道:可能需要40或50個處理器週期。例如,這將遠遠少於1微秒。

所以我會投票選擇:store raw,display pretty。

2

由於格式化是一個與數據存儲無關的顯示問題,並且由於同一段數據可能根據環境的不同格式化,因此應該將未格式化的數據存儲在數據庫中,並在應用程序中適當地格式化數據。

您可以構建一個應用程序,其中可以從不同的語言環境查看相同的數據。對於不同的用戶,可能需要對同一數量的金額,時間點或數字進行不同的格式設置,具體取決於他們來自何處。你的數據模型應該(其中MySQL是很大的一部分)不應該處理格式化,否則表示層需要將數據從一種格式轉換爲另一種格式。這是不理想的,並可能導致可維護性惡夢。這就是爲什麼你應該努力以獨立於演示文稿格式的方式存儲數據。

0

我只將電話號碼存儲爲數字。這個數據庫中的軍刀空間。格式可以改變。另外,編寫簡潔的代碼時,需要重新使用代碼來爭取。 此功能可以減少數據庫表格中少於100個左右格式化電話號碼的空間。

function format_phone($phone = '', $convert = false, $trim = true){ 
     // If we have not entered a phone number just return empty 
     if (empty($phone)) { 
      return ''; 
     } 

     // Strip out any extra characters that we do not need only keep letters and numbers 
     $phone = preg_replace("/[^0-9A-Za-z]/", "", $phone); 

     // Do we want to convert phone numbers with letters to their number equivalent? 
     // Samples are: 1-800-TERMINIX, 1-800-FLOWERS, 1-800-Petmeds 
     if ($convert == true) { 
      $replace = array('2'=>array('a','b','c'), 
        '3'=>array('d','e','f'), 
         '4'=>array('g','h','i'), 
        '5'=>array('j','k','l'), 
            '6'=>array('m','n','o'), 
        '7'=>array('p','q','r','s'), 
        '8'=>array('t','u','v'), 
        '9'=>array('w','x','y','z')); 

      // Replace each letter with a number 
      // Notice this is case insensitive with the str_ireplace instead of str_replace 
      foreach($replace as $digit=>$letters) { 
       $phone = str_ireplace($letters, $digit, $phone); 
      } 
     } 

     // If we have a number longer than 11 digits cut the string down to only 11 
     // This is also only ran if we want to limit only to 11 characters 
     if ($trim == true && strlen($phone)>11) { 
      $phone = substr($phone, 0, 11); 
     }       

     // Perform phone number formatting here 
     if (strlen($phone) == 7) { 
      return preg_replace("/([0-9a-zA-Z]{3})([0-9a-zA-Z]{4})/", "$1-$2", $phone); 
     } elseif (strlen($phone) == 10) { 
      return preg_replace("/([0-9a-zA-Z]{3})([0-9a-zA-Z]{3})([0-9a-zA-Z]{4})/", "($1) $2-$3", $phone); 
     } elseif (strlen($phone) == 11) { 
      return preg_replace("/([0-9a-zA-Z]{1})([0-9a-zA-Z]{3})([0-9a-zA-Z]{3})([0-9a-zA-Z]{4})/", "$1($2) $3-$4", $phone); 
     } 

     // Return original phone if not 7, 10 or 11 digits long 
     return $phone; 
    } 
0

我喜歡在報告/顯示中典型地格式化數據,可以節省空間並在某些情況下提高性能。

最終我認爲這取決於你如何使用數據。如果電話號碼不會用於分析,並且只是詳細信息,那麼存儲格式化的字符串不會太大傷害。

如果您將使用該字段執行任何計算,請務必將其保存在適當的數據類型中。姓名/地址/電話/郵編是我經常保持字符串,沒有多大意義的字段。

0

請求格式!

任何有任何正規學術數據庫培訓的人都會告訴你這個。如果格式化發生在數據庫客戶端而不是數據庫本身,則更好。