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

Php 从id获取可读数据的最佳方法,php,mysql,human-readable,Php,Mysql,Human Readable,当我得到这个场景时,我正陷入一个问题: 我必须做一个关于用户做什么的历史记录,当然用户可以做很多不同的动作 我想有两种不同的方法可以让我成功,我只需要有人能帮我走正确的路 第一种方式: 创建两个不同的表 历史用户 历史类型 历史记录\u用户表格 id | user_id | history_type (int) 1 1 1 1 3 2 历史类型 id | name_action (string) 1 The us

当我得到这个场景时,我正陷入一个问题:

我必须做一个关于用户做什么的历史记录,当然用户可以做很多不同的动作

我想有两种不同的方法可以让我成功,我只需要有人能帮我走正确的路

第一种方式:

创建两个不同的表

  • 历史用户
  • 历史类型
历史记录\u用户表格

id | user_id | history_type (int)
 1      1             1
 1      3             2
历史类型

id | name_action (string)
 1   The user has posted on the wall
 2   The user has change his profile picture
然后只需使用
History\u user.History\u type=History\u type.id

第二种方式:

创建历史用户表和名为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);

辅助对象和历史类型表都是信息表示所必需的。就性能而言,这并不重要,因为您将只在一个表中插入用户操作。如果需要表示数据,则只需再进行一次查询即可获得操作的描述(如果希望获得某种性能,则不需要连接、ofc)。因此,双表方式更加灵活和可扩展

您仍然可以使用helper函数,该函数将具有静态缓存变量-array of id=>name of actions,它将延迟加载到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);

我只需要做连接,如果建立索引,它将非常快。将数据保存在表中对维护也有好处。谢谢你的回答,但是当你说
时,你只需要再查询一次就可以得到操作的描述(如果你想要一些性能,不需要连接,ofc)。
为什么执行2次查询比执行1次查询的性能更高?你能不能说得更准确一些,因为我不明白助手在拥有这两个表时是如何有用的。我感谢你的帮助干杯使用两个表的方式,当试图表示某些用户操作的日志时,只会丢失性能。性能损失相当于一个使用索引字段的查询,这不是太大的损失。在插入到日志中时并没有什么区别-您仍然只会在一个表中插入。或者您是指“无连接”部分?联接速度并不比两个查询快。特别是当它涉及到“重复的”连接值时。连接也会给你带来太多的信息。如果有一个用户在墙上贴了10次,您将得到10次“wall post”字符串来回复您的sql查询。如果您知道id=1已经是“墙柱”,则不需要这样做。此外,您还可以在稍后的代码中重复使用id=>name paris的列表,以此类推。下面是转换器类示例,它将只执行一次mysql查询以输出操作名称: