哪个更好,存储格式化的值,或在请求时格式化

时间:2013-07-03 03:06:59

标签: mysql sql

像手机这样的值,我们应该存储它已格式化,还是在请求时格式化? 哪种性能更好?

在像巴西这样的国家,我们有代码55,城市代码如11,但我们的电话号码是5位或4位加上4位数,如: +55(11)9999-9999或+55(21)9999-9999,存储未格式化的值,少数几个国家/地区,您的国家/地区代码为1,2,3或4位,在请求时将很难格式化,因为! 存储格式化,我将使用更多的空间存储,INT< VARCHAR。 但是通过处理,我们只是抛出值来显示。 如果我将它存储为数字,我必须有很多IF来识别国家和格式,占用空间小但处理时间长。

对不起我的英语。

5 个答案:

答案 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)

请求时格式化!

任何有正式学术数据库培训的人都会告诉你。如果这种格式化发生在数据库客户端,而不是数据库本身,那就更好了。