从id获取可读数据的最佳方式

时间:2014-01-28 11:14:03

标签: php mysql human-readable

当我遇到这种情况时,我遇到了一个问题:

我必须创建一个关于用户操作的历史记录,当然用户可以做很多不同的操作。

我认为两种不同的方式让我只需要一个可以帮助我按照正确的方式行事的人。

第一种方式:

创建2个不同的表

  • History_user
  • History_type

History_user

id | user_id | history_type (int)
 1      1             1
 1      3             2

History_type

id | name_action (string)
 1   The user has posted on the wall
 2   The user has change his profile picture

然后只使用History_user.history_type = History_type.id

加入查询

第二种方式:

创建History_user表和一个名为Converter的帮助程序示例。

<?php

class Converter {

  function history($type_history) {
        switch($type_history) {
           case 1:
            $human_history = "The user has posted on the wall";
           break;

           case 2:
             $human_history = "The user has change his profile picture";
           break;
        }

        return $human_history;
  }

}

$converter = new Converter();
$converter->history(1);

在性能和可维护性方面,我一直在寻找更好的方法。谢谢。

1 个答案:

答案 0 :(得分:1)

辅助器和History_type表都是信息表示所必需的。在性能方面它并不重要,因为您只会在一个表中插入用户操作。如果您需要表示数据,则只需要一个查询来获取操作的描述(没有连接,ofc,如果您想要一些性能)。因此,2表格方式更灵活,可扩展。

你仍然可以做那个帮助函数,让我们说有静态缓存变量 - 数组id =&gt;动作的名称,这将延迟加载在history()函数上,如下所示:

class Converter {
    protected static $_cache;

    protected static function _loadCache() {
        if (null !== self::$_cache) {
            return;
        }
        self::$_cache = array();
        $query = "SELECT * FROM `History_type`";
        $res = mysql_query($query);
        while ($row = mysql_fetch_assoc($res)) {
            self::$_cache[(int) $row['id']] = $row['action'];
        }
    }

    public static function history($id) {
        self::_loadCache();
        return isset(self::$_cache[$id]) ? self::$_cache[$id] : 'Undefined action';
    }
}

Converter::history(1);