用于在WordPress中记录用户操作的数据库设计

时间:2012-12-05 18:00:02

标签: php mysql database wordpress database-design

我需要一个表来记录用户在WordPress中所做的某些操作。

截至目前,这是我所采用的数据库架构:

id bigint(20) NOT NULL AUTO_INCREMENT,
uid bigint(20) NOT NULL,
type VARCHAR(256) NOT NULL,
data1 TEXT NOT NULL,
data2 TEXT NOT NULL,
data3 TEXT NOT NULL,
timestamp bigint(20) NOT NULL,
UNIQUE KEY id (id)

让我澄清一下:

uid: User ID of the wordpress user
type: Type of action the user made (can be 'comment', 'new_post', 'login', etc)
data1/2/3: additional data (for example, ID of comment or post made)

要显示日志,我会查询数据库并运行某个过滤器以获取要为该特定日志显示的文本。所以它的工作原理如下:

if( $type == 'comment') {
    $comment = get_comment( $data1 );
    $user = get_user($uid);
    echo "User {$user->name} has made a <a href='{$comment->permalink}'>comment</a>";
}

这是最有效的做事方式吗?这对我来说似乎很好,因为我不想只是将HTML存储在日志表中以供输出。

然而,问题出现在我想要在满足某些条件时隐藏特定日志条目的地方。例如,如果评论不再存在,我想隐藏该条目。这会给分页带来一些问题。关于如何克服这个问题的任何建议?

谢谢!

编辑:

myplugin_transactions
id bigint(20) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
type VARCHAR(256) NOT NULL,
timestamp bigint(20) NOT NULL,
UNIQUE KEY id (id)

myplugin_meta
id bigint(20) NOT NULL AUTO_INCREMENT,
txn_id bigint(20) NOT NULL,
key VARCHAR(256) NOT NULL,
data TEXT NOT NULL,
UNIQUE KEY id (id)

假设我想从myplugin_transactions中选择*,其中data1通常是'x'而data2是'y'。在这种情况下我该怎么做?

SELECT * FROM myplugin_transactions LEFT JOIN myplugin_meta ON myplugin_transactions.id = myplugin_meta.txn_id WHERE ( ... ? )

1 个答案:

答案 0 :(得分:1)

这个答案非常通用,因为它没有提供任何代码,但是评论也太长了。

首先,您不应该在data1data2data3字段中存储其他数据。您使用的是MySQL,因此您拥有关系数据库的强大功能。使用它们。

您应该只拥有另一个表,该表具有ID字段(操作的ID)和数据字段。这样,您可以将0存储为您想要的多个项目元数据。我的意思是,wordpress已经用元数据做了吗?

其次,如果删除了评论,您只是想删除与其相关的操作吗?如果是这样,只需挂钩API即可。我相信delete_comment有一个钩子:http://codex.wordpress.org/Plugin_API/Action_Reference#Comment.2C_Ping.2C_and_Trackback_Actions

否则,如果您想保留操作,可以添加额外的字段或称为deleted的元数据。删除评论时,如上所述:挂钩delete_comment电话并将操作更新为deleted = true。然后,当您对所有操作运行查询时,排除已删除的语句,例如... WHERE deleted = NULL ...等。

EDIT2:

要回答你的select语句,这样的事情可以起作用:

SELECT * FROM myplugin_transactions 
LEFT JOIN myplugin_meta AS data1 
ON ( myplugin_transactions.id = data1.txn_id AND data1.key = 'data1' )
LEFT JOIN myplugin_meta AS data2 
ON ( myplugin_transactions.id = data2.txn_id AND data2.key = 'data2' )
WHERE data1.data = 'x'
AND data2.data = 'y'

显然用有意义的描述替换data1data2个关键字。