具有数组值的唯一元关键字与具有单个值的重复元关键字

时间:2018-04-12 作者:Luis Rivera

比方说,我想建立一个功能,允许我的用户喜欢我网站上的帖子。

我的目的是将喜欢该帖子的用户的ID存储为元数据。

我的问题是,在性能和“可查询性”方面,最好的方法是什么。

每种类型的单独行:

\'liked_by\'=>\'3\'
\'liked_by\'=>\'21\'
\'liked_by\'=>\'17\'

或者仅一行来保存一个包含所有ID的序列化数组(json)

\'liked_by\'=>array(\'3\',\'21\',\'17\')

考虑到我也想存储每个喜欢的日期。

array( $user_id => $current_date )

否则,请考虑我最能确保所有post元数据对查询都有用!

编辑

为了简单起见,我使用了“likes”示例,但实际上,我想为我的应用程序创建的功能是让用户付费解锁每篇文章的额外内容。我的应用程序市场不太大,比如说,我预计每篇文章的解锁次数不会超过400次,但这意味着每篇文章会增加400行,只是为了容纳解锁帖子内容的用户+每次解锁的日期。

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

Neither option are the correct option for your use case

你的问题选错了树,因为你忘了提到你打算根据meta的值来搜索这些帖子。

如果要显示帖子,可以使用任何一种方法,尽管第一种方法在代码中处理起来更干净/更简单。get_post_meta 速度很快,并且依赖于表索引,无论如何,WP都会提前获取post meta。

这里的问题是,如果您有数千个post-meta,或少数超大型post-meta,在极端情况下,这可能会导致内存不足或阻止对象缓存缓存它

但如果你搜索它们呢

显示喜欢该帖子的用户列表会很快,但显示用户喜欢的帖子列表?

This is what would happen to your sites speed and performance:

enter image description here

通过他们的帖子元搜索帖子是非常非常糟糕的。我见过一些在大型服务器上运行的网站被其中的一小部分损坏。这是一个巨大的减速,这种查询可能需要10-20秒才能完成,如果你有超过几个帖子的话。

在这种情况下,您也将面临一个新问题,如果您选择了选项2,那么查找这些帖子的能力将成为一个问题。因此,选项1会更好,但性能仍然很差

一个略胜一筹的解决方案具有相反的权衡,它使用用户元来存储post id,而不是使用post meta来存储用户id。仍然存在问题,即显示喜欢或解锁帖子的用户列表现在非常昂贵。但向用户显示他们喜欢的所有帖子很快。

真正的解决方案和一般经验法则,如果您需要存储某些内容,并且需要搜索/查找/筛选或显示包含此特殊信息的帖子,use a taxonomy.

在本例中,一个名为unlocked_by, 其中,术语slug/name是喜欢它的用户ID。

现在您的查询是super 快速:

$q = new WP_Query([
    \'unlocked_by\' => get_current_user_id()
]);
事实上,它太快了,你甚至不需要那个查询,WP在/unlocked_by/2/ (顺便说一句,我是2号用户),假设您启用了该功能。

您甚至可以通过以下方式添加参数pre_get_posts 所以这是透明的。

这个wp_get_object_termswp_get_object_terms 功能是您的朋友

SO网友:Mark Kaplun

非常简单,元不应该被查询,因为它不可伸缩。一旦解决了这一问题,您应该更喜欢将数据存储为序列化数组,因为它使元表更小,因此对它的所有操作都更快。

OTOH,如果您的用例需要频繁更新特定的post数据,那么数组方法的扩展性就不会很好,因为数组越大,每个“写”操作的成本就越高,但我想我从来没有听说过任何wordpress站点发现这是一个瓶颈。

结束

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在