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

标签 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 ( ... ? )

最佳答案

这个答案将是非常通用的,因为它不提供任何代码,但对于评论来说也太长了。

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

您应该有另一个表,它有一个 ID 字段(操作的 ID)和一个数据字段。这样您就可以将 0 存储到任意数量的元数据中。我的意思是,wordpress 已经使用元数据执行此操作了吗?

其次,如果一条评论被删除,你只是想删除与其相关的 Action 吗?如果是这样,只需连接到 API。我相信 delete_comment 有一个钩子(Hook):http://codex.wordpress.org/Plugin_API/Action_Reference#Comment.2C_Ping.2C_and_Trackback_Actions

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

编辑2:

要回答您的 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 关键字。

关于php - 在 WordPress 中记录用户操作的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13729508/

相关文章:

java - 从数据库获取数据时ArrayIndexOutOfBounds异常问题

mysql - 如何在数据库中建模面向对象的设计?

java - 如何使用 Java 连接到基于 Web 的 Oracle 数据库?

php - Laravel 中如何分离 Controller 方法?

mysql - MySQL 命令 SELECT 的奇怪行为

php - MySQL动态表名关系

MySQL 查询未返回正确结果

python - 尝试修复 SQL 语法中的错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法

javascript - 显示 map ,同时通过 ajax/php 从数据库检索坐标

php - 如何制作简单的动态幻灯片/游戏中时光倒流