【问题标题】:Is it better to create new fields in post table in Wordpress or create new table在 Wordpress 的 post 表中创建新字段还是创建新表更好
【发布时间】:2015-07-05 05:04:30
【问题描述】:

我对使用 Wordpress 还是很陌生,不知道选择什么解决方案。

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

因此,我认为我必须在帖子表中添加新字段以便存储数据。

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

因此,如果我在这个 wp_postmeta 表中保存 20 个字段 X 2 行 X 200.000 个条目,它将使 8.000.000 行通过(可能不利于性能)。

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

  • 创建一个新表? (我不会利用常规的帖子功能和缓存的可能性)

  • 向 post 表添加新字段? (会兼容WP升级吗?)

  • 使用后元/选项表? (在这种情况下表现如何?)并继续这个解决方案?

非常感谢您的帮助

【问题讨论】:

    标签: php mysql wordpress custom-fields


    【解决方案1】:

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


    创建一个新表? (我不会利用常规的帖子功能和缓存的可能性)

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

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

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

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


    使用后元/选项表? (在这种情况下表现如何?)并继续这个解决方案?

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

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

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

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

    因此,如果我在这个 wp_postmeta 表中保存 20 个字段 X 2 行 X 200.000 个条目,它将使 8.000.000 行通过

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

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

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


    向 post 表添加新字段? (会不会兼容WP升级?)

    这种方法与创建单独的表几乎相同:

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

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

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

    【讨论】:

    • 关于性能的一个非常糟糕和错误的答案。索引不保留数据,因此您可以进行 n 次磁盘访问,而不是使用 n 列表。但是 800 万个数据单元并不多,即使是很小的 VPS RAM 也能很好地适应。除非很多项目的数据差异很大,否则最好将其存储在额外的表中。或者,如果搜索不需要额外的数据字段,请使用 JSON 对象将其全部存储在一个元数据中。
    • @Lothar 关于创建附加表,这不是我说的吗?一般来说,创建额外的表会更高效,但这不是 WordPress 开箱即用的方式。在撰写本文时,ACF 没有提供任何用于处理其他表的功能,据我所知,这也不是当前支持的功能。如果您创建额外的表,您将失去 ACF 提供的所有功能,这将花费大量的开发时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多