活动饲料结构

时间:2012-04-08 17:33:27

标签: php mysql

我正在构建一个函数,它会将我的用户所做的事情的日志添加到我的数据库中,以便我可以为其他用户的活动源构建活动源。

到目前为止,我的想象相似。

活动表

id | user_id | source | source_id | timestamp

示例输入

1 | 1 | photo_upload | 54 | 1333906150 //54 being the ID of the photo in my DB
2 | 1 | follow | 2 | 1333906159 // 2 being the id of a user

通过这种方式,我可以轻松地从数据库中为用户活动提取信息,"user_id = {$followers}然后根据其来源显示它们,例如显示photo_upload的图像。

修改 什么是显示不同类型的饲料的最佳方式。 这就是我现在所拥有的,但似乎有点多。

<?php
$grab = mysql_query("SELECT * FROM `activity` WHERE `user_id` IN (".$following.") ORDER BY `id` DESC");

while($row = mysql_fetch_array($grab)){

    switch ($row['source']) {
        case "photoupload":
            // Display photo upload layout
            break;
        case "follow":
            // Display follow layout
            break;
    }

}
?>

有没有人看到任何改进方法?

2 个答案:

答案 0 :(得分:2)

创建描述feeditem类型的抽象类:

abstract class Application_Feed_Item_Abstract {
    protected $_item;

    public function __construct($itemData) {
        $this->_item = $itemData;
    }

    abstract public function render();
}

为不同类型的内容实现此类:

class Application_Feed_Item_Photo extends Application_Feed_Item_Abstract {
    public function render() {
        //Custom rendering logic for a Photo
        return '<div>Watch my <a href="photo.php?id=' . $this->_item['source_id'] . '">photo</a></div>';
    }
}

class Application_Feed_Item_Follow extends Application_Feed_Item_Abstract {
    public function render() {
        //Custom rendering logic for a Follower
        return '<div>I got a new <a href="photo.php?id=' . $this->_item['source_id'] . '">follower</a></div>';
    }
}

因此,当您拉取记录时,您可以根据Feeditem的类型动态创建渲染器对象:

//Pull items from database and store them as an Array or other iterable object.
//Here i assume we call this collection of rows from the database $feeditems

//Mapping of source to renderer classes
$types = array(
    "photoupload" => "Application_Feed_Item_Photo",
    "follow" => "Application_Feed_Item_Request",
    "somethingelse" => "Application_Feed_Item_Somethingelse"
);

//Process every item
foreach($feeditems as $item) {
    $type = $item['source'];
    if(!array_key_exists($type, $types)) {
        throw new Exception("Unsupported feeditem type.");
    }
    $type = $types[$type];

    $renderer = new $type($item);
    echo $renderer->render();
}

实现它的方法只是一个宽松的想法。但正如另一位用户所说,根据您的要求,有许多不同的方法可以做到这一点。您在问题中使用的方法可以正常使用

答案 1 :(得分:0)

有许多方法可以给猫皮肤。同样,有很多方法可以达到您所需的相同结果。

“改善”IMO的一些建议是 -

<强> 1。使用AJAX调用将此数据作为预生成的HTML获取。

加载页面后使用AJAX调用,您可以让服务器构建用户活动供稿的HTML段。这将使您的页面加载速度更快,您的内容将在不久之后加载。

您甚至不必在服务器上构建HTML - 您也可以从AJAX调用中传回JSON对象并使用JavaScript构建HTML。

<强> 2。创建用户Feed的缓存静态HTML文件,该文件只包含在标记中。

您可以让服务器以特定间隔(例如每30分钟)生成用户Feed所需的所有HTML,然后将该HTML保存到文件中以包含在现有HTML中。您可以使用PHP的include()函数执行此操作。

使用此方法,活动源在刷新时会有延迟,因此它可能不是最佳选择 - 但如果您将间隔设置得更小 - 例如每5分钟一次,您将节省大量对数据库的调用

查看cron jobs - 您可以使用它们来安排更新。

第3。在您的数据库中的index字段上放置user_id,因为您使用它来按用户进行搜索。

这是非常重要的一项,特别是如果您希望数据库中存在许多条目。在用于搜索表的字段上放置索引将极大地提高查询的性能。


我确信这里可以提出更多的建议。