最有效的制作活动日志的方法

6
我正在为我的网站上的个人资料制作一个“最近活动”选项卡,并且我还将为管理员设置一个日志,以查看网站上发生的所有事情。这将需要制作某种类型的活动日志。
我不知道哪种方式更好。我有两个选择:
1.创建一个名为“activity”的表,然后每次有人执行操作时,添加一条记录,包括操作类型、用户ID、时间戳等。 问题:表可能会变得非常长。
2.连接所有三个表(questions,answers,answer_comments),然后以操作顺序的方式在页面上显示所有内容。 问题:这将非常困难,因为我不知道如何通过连接3个表来使其显示为“John评论了此处的问题标题的答案”。
是否有人知道在这种情况下制作活动日志的更好方法?我正在使用PHP和MySQL。如果这要么效率低下要么太困难,我可能会忘记个人资料上的最近活动选项卡,但我仍然需要为管理员创建活动日志。
这是一些我开始制作第二个选项的SQL语句,但这将无法工作,因为在while循环中输出信息时无法检测到操作是评论、问题还是回答。
SELECT q.*, a.*, ac.* 
    FROM questions q JOIN answers a ON a.questionid = q.qid
        JOIN answer_comments ac ON c.answerid = a.ans_id
WHERE q.user = $userid 
AND a.userid = $userid 
AND ac.userid = $userid
    ORDER BY q.created DESC, a.created DESC, ac.created DESC

感谢您提前提供的任何帮助!
2个回答

1

我喜欢“选项2”,基本上你会复制你的数据,这会增加额外的读写操作,会使事情变慢。也许不要这样做,而是

SELECT q.*, a.*, ac.* 

你可以从每个表格中获取所需的数据,或者稍微更清晰一点的方式是,在将查询限制为仅选定用户的帖子并按发布日期排序之后,对这三个表格进行Union

这看起来是个好主意,但在 while 循环中,我如何检测操作是回答、问题还是评论?如果我能做到这一点,那么这将起作用,我可以说:“{User} 在问题标题上发表了评论”,如果是评论,然后“{User} 提出了问题标题”如果是问题等。 - Nathan
你可以为类型添加一个变量,例如在每个选择语句中添加一个字符串来表示它是什么:select 'question' as activity_type, q.field1, 等等 from ... - John Kane

1
为什么你有q.userq.userid
对于选项2(在正确建立索引的情况下更好的选项),我认为UNION是你要找的更多内容。像这样:
SELECT 'question' AS action, id, created 
    FROM questions WHERE userid = {$userid}
    UNION
SELECT 'answer' AS action, id, created
    FROM answers WHERE userid = {$userid}
    UNION
SELECT 'comment' AS action, id, created
    FROM answer_comments WHERE userid = {$userid}
ORDER BY created DESC LIMIT 20

'question' / 'answer' / 'comment' 告诉您所采取的操作。您可能遇到的问题是:由于是UNION,每个SELECT语句必须具有相同数量的列,因此如果其中一个较短,您可以添加NULL,例如:

SELECT 'comment', id, created, NULL FROM ac

此外,如果其中一个created列的名称不同,您可以使用别名。
SELECT 'comment', id, comment_date AS created FROM ac

抱歉,第二个应该是 a.userid(那是一个打字错误)。不管怎样非常感谢!我会尝试这个方法,如果能解决我的问题,我就会接受你的答案:D 谢谢你提供的识别注释、问题或答案的方式,因为我以前从来不知道可以这样做。 - Nathan
这基本上是可以工作的 :) 我只是在连接问题表以获取问题信息以便进行链接等方面遇到了一些小问题。以下是SQL和PHP代码:http://screencast.com/t/EJgdGkMPBB 由于某种原因,在评论中似乎显示问题ID作为标题,而对于答案,则根本不显示标题:http://screencast.com/t/qvDzliDs9U 我知道有些东西还没有加入,比如$row['qSlug']之类的(它是标题的URL slug),但这不应影响其他内容。 - Nathan
关联键的名称来自于第一个 SELECT。您应该首先选择所有共同的列 (id, created, q_id, q_title),然后选择不同的列 (a.ans_idac.id)。这不是缺陷 - UNION 旨在选择相同的数据。至于空白标题,您正在使用 qTitle 而不是 q_title - andrewtweber
这个有帮助吗?如果可以,请点击“接受回答”,如果您还有其他问题,我很乐意提供帮助。 - andrewtweber
我接受了。谢谢你的帮助,这是一个好的解决方案,比起为活动日志制作整个表格要好得多。 - Nathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接