在 Wordpress post table 中创建新字段或在 table 中创建新字段更好吗?

Is it better to create new fields in post table in Wordpress or create new table

我刚开始使用 Wordpress,不知道要选择什么解决方案。

我必须在 Wordpress post 的 table 中存储超过 200.000 个条目(书籍、CD 等)。这些条目中的每一个都有大约 20 个不同的字段要填充。

因此,我认为我必须向 posts table 添加新字段以便存储数据。

我正在使用 ACF 自定义字段插件来执行此操作,但我可以看到自定义字段未存储在与 post table 相同的 table 中。它被存储在 wp_options table 中用于类别,在 postmeta table 中用于 posts 并且每个要填充的字段将创建 2这些 table 中的行。

因此,如果我在此 wp_postmeta table 中保存 20 个字段 X 2 行 X 200.000 个条目,它将使 8.000.000 行通过(对于性能来说可能不太好)。

使用 Wordpress 完成此任务的最佳方法是什么?

非常感谢您的帮助

您列出的每种方法都各有利弊:


Create a new table ? (I'll not take benefit of the regular post features and cache possibilities)

优点: 性能
缺点: 灵活性,功能

灵活性 通过为每个字段创建一个包含列的 table,您会失去灵活性。与仅使用元数据相比,添加新字段更加困难。对于具有大量行的 tables,添加或删除列是一项昂贵的操作,因此如果您需要经常修改架构,这可能不是正确的方法。

功能 使用这种方法,您将无法利用内置方法与元数据进行交互(例如 get_post_meta)。您还将很难根据元数据查询帖子。您仍然可以缓存您的数据,但您必须手动进行。据我所知,您将不会 能够继续通过这种方法使用 ACF。

性能 从积极的方面来说,将每个字段作为单独的列 table 可以让您更好地索引数据。这是否对您有利取决于您需要 运行.

的查询

Use postmeta/option tables ? (what about performances in this case ?) and go ahead with this solution ?

缺点: 灵活性,功能
优点: 性能

显然,如果您坚持使用处理元数据的默认方法,您可以继续使用所有内置功能与该数据进行交互。您还可以在不改变 table 结构的情况下添加或删除元字段。

关于性能,您将无法像使用单独的 table 那样创建索引来提高查询的性能。如果您的查询不能利用 postmeta table 上的索引,这只是一个严重的问题。

请注意 wp_postmetapost_idmeta_key 上有索引,但在 meta_value 上没有。这意味着如果您根据元值查找记录并且有很多行共享相同的元键,数据库必须查看所有具有特定元键的行以找到具有元键的行您正在寻找的价值。

So if I save 20 fields X 2 lines X 200.000 entries in this wp_postmeta table, it will make 8.000.000 lines to go through

根据您的查询,这可能不是一个严重的问题。正如我之前提到的,postmeta table 在 post_id 上有一个索引,所以如果你只是通过 post_id 查找元条目,这不是一个严重的问题。

只要您的查询可以利用索引,800 万行对 MySQL 来说不是问题。

如果您只是根据 post_id 索引进行查询,那不是问题。就内存而言,无论使用哪种方法,您都将需要大致相同的内存量。


Add new fields to the post table ? (will it be compatible with upgrade of WP ?)

此方法与创建单独的 table 几乎相同:

  • 您将有更大的能力通过建立索引来提高性能 你的帖子 table
  • 您将无法使用内置功能 用于与元数据交互
  • 添加和删除字段会更加困难

认为这不会导致升级 WordPress 时出现问题。即使升级包括对 wp_posts table 的修改,具有额外的列 也不应该 导致问题。在生产升级之前,我肯定会在暂存环境中测试升级。

一般来说,我认为最好避免修改核心 WordPress 功能,包括修改默认的 table 结构。与单独的 table 相比,这种方法不会有任何显着的性能优势,所以我认为最好采用另一种方式。