像手机这样的值,我们应该存储它已格式化,还是在请求时格式化? 哪种性能更好?
在像巴西这样的国家,我们有代码55,城市代码如11,但我们的电话号码是5位或4位加上4位数,如: +55(11)9999-9999或+55(21)9999-9999,存储未格式化的值,少数几个国家/地区,您的国家/地区代码为1,2,3或4位,在请求时将很难格式化,因为! 存储格式化,我将使用更多的空间存储,INT< VARCHAR。 但是通过处理,我们只是抛出值来显示。 如果我将它存储为数字,我必须有很多IF来识别国家和格式,占用空间小但处理时间长。
对不起我的英语。
答案 0 :(得分:5)
好吧,考虑一下典型的现代台式计算机每秒可以进行6到70亿次计算。
数据应以最佳格式存储,以便执行您在数据库中执行的操作:搜索,排序和比较。电话号码可能以不同格式从UI进入(例如“(800)555-1212”,“800-555-1212”“800 555-1212”,“8005551212”)。允许不同的功能(如匹配)几乎要求在存储到数据库之前删除格式,然后在显示时进行预处理。
格式化电话号码的处理器开销很小:可能是40或50个处理器周期。例如,在i5上,这将远远不到一微秒。
所以我会投票给:存储原始,显示漂亮。
答案 1 :(得分:2)
由于格式化是一种独立于数据存储的显示问题,并且因为同一条数据的格式可能因环境而异,所以您应该将未格式化的数据存储在数据库中,并在应用程序中根据需要进行格式化。
您可以构建一个可以从不同区域设置查看相同数据的应用程序。对于不同的用户,可能需要针对不同的用户格式化相同数量的金额,时间点或数字,具体取决于他们来自何处。您的数据模型应该(其中MySQL是其中的一个重要部分)根本不应该处理格式化,否则表示层需要将数据从一种格式转换为另一种格式。这不是最理想的,可能导致可维护性的噩梦。这就是为什么你应该努力以独立于表示格式的方式存储数据。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
我喜欢通常在报表/显示上格式化数据,可以节省空间并在某些情况下提高性能。
最终我认为这取决于你如何使用数据。如果电话号码不会用于分析,只是详细信息,那么存储格式化的字符串不会造成太大损害。
如果您要使用该字段执行任何计算,请务必将其保存在适当的数据类型中。姓名/地址/电话/邮编是我经常保留的字符串,但后果不大。
答案 4 :(得分:0)
任何有正式学术数据库培训的人都会告诉你。如果这种格式化发生在数据库客户端,而不是数据库本身,那就更好了。