Answers:
我很少不同意其他知识渊博的用户,但是在这种情况下我无能为力。我认为,调用非核心数据库表本身就是不好的做法,这完全是错误的。
选择使用核心表还是添加自己的表取决于几个因素。
查询的执行时间取决于表的大小。因此,如果您打算存储大量数据,那么仅适合这种类型的特定数据集的单独表将不可避免地成为更有效的解决方案。
如果您将大量常规帖子或CPT与这些特定数据集一起存储,wp_posts
并且wp_postmeta
可以快速增长。
对我来说,这种选择最终取决于数据的“发布”程度。它应该支持作者,评论,修订,摘录或类似内容吗?如果是这样,我将介绍CPT和/或核心功能。如果没有,我将使用单独的表以节省资源并提高效率。
如果Eugene的想法是正确的,那么现有的编写良好的插件都不会添加自己的表,幸运的是事实并非如此。
$wpdb
类。wp_options
,并通过迫使插件开发人员仔细考虑正在创建/存储的数据类型-是否是CPT?这是分类法吗?是发布元吗?但是,对于那些需要单独的数据库表的用例,请确保使用WordPress提供的用于将自定义表添加到WordPress数据库的方法,尤其是这样,您就可以利用功能强大的$wpdb
类。请注意该食典条目列出的信息/说明:
设置信息 -用户首次设置您的插件时输入的用户选择,并且不会超出此范围(例如,在与标签相关的插件中,用户关于标签云格式的选择)侧边栏)。设置信息通常将使用WordPress选项机制存储。
数据 -用户继续使用您的插件时添加的信息,通常是与帖子,类别,上载和其他WordPress组件相关的扩展信息(例如,在与统计相关的插件中,各种页面视图,引荐来源网址以及与您网站上每个帖子相关的其他统计信息)。数据可以存储在一个单独的MySQL表中,该表必须创建。但是,在使用全新表之前,请考虑将插件的数据存储在WordPress的Post Meta(也称为“自定义字段”)中是否可行。Post Meta是首选方法;尽可能/实际使用它。
因此,我们可以得出以下结论:
$wpdb
(我的回答中暗含了使用非核心表的意思,不想错过那个班级)
如果您的数据比WordPress帖子模型更复杂,则非核心数据库表是必须的,它将变得非常庞大,并且其中包含大量要搜索的元详细信息。
WordPress用于其后meta的EAV格式不适用于多标准搜索。
如果将元数据划分为多个条目,则帖子元表中每个帖子将有许多条目,并且通过元搜索任何帖子将更加慢。
如果将所有序列化的元数据存储在数组中,并且仅作为后元数据中的一个条目,则这一次您将被迫仅在该元数据内进行文本搜索,并且您将无法直接在sql查询中使用比较运算符。
如果您的插件没有成千上万的条目和相关的元数据,那么这不是什么大问题。
但是,如果您的插件要做任何大事,这是一个主要问题。
您的情况,作为独立条目的文件名以及附加到该条目的3个元数据条目似乎并不大。您可以使用wordpress发布表和meta表。
但是,如果人们要大量搜索这3个meta,尤其是一起搜索,那么我建议您设置单独的表。
使用这种格式,只有一个表只有一个表,其中还包含所有元数据,这样就可以了,并且可以快速查询闪电。
顺便说一句,如果您使用WordPress表并且还使用查询缓存,则用户搜索您的数据将随着时间的流逝而缓存,并且产生较少的负载。但这不会像单独创建表那样谨慎。
您可以将文件上传到媒体库。媒体库中的每个项目都存储在它的wp_posts
表中。这意味着每个文件都可以具有元数据。wp_postmeta
通过使用Metadata API,您可以根据需要为表中的每个文件保存尽可能多的信息。
为插件创建自己的表是不好的做法吗?
是的,如果可以改为使用核心功能,则创建自己的表是一种不好的做法。
class TMM {
public static $options;
public static function register() {
self::$options = get_option(TMM_THEME_PREFIX . 'theme_options');
}
public static function get_option($option) {
return @self::$options[$option];
}
public static function update_option($option, $data) {
self::$options[$option] = $data;
update_option($prefix . 'theme_options', self::$options);
}
//ajax
public static function change_options() {
$action_type = $_REQUEST['type'];
$data = array();
parse_str($_REQUEST['values'], $data);
$data = self::db_quotes_shield($data);
if (!empty($data)) {
foreach ($data as $option => $newvalue) {
if (is_array($newvalue)) {
self::update_option($option, $newvalue);
} else {
$newvalue = stripcslashes($newvalue);
$newvalue = str_replace('\"', '"', $newvalue);
$newvalue = str_replace("\'", "'", $newvalue);
self::update_option($option, $newvalue);
}
}
}
_e('Options have been updated.', TMM_THEME_FOLDER_NAME);
exit;
}
public static function db_quotes_shield($data) {
if (is_array($data)) {
foreach ($data as $key => $value) {
if (is_array($value)) {
$data[$key] = self::db_quotes_shield($value);
} else {
$value = stripslashes($value);
$value = str_replace('\"', '"', $value);
$value = str_replace("\'", "'", $value);
$data[$key] = $value;
}
}
}
return $data;
}
}