`
阿尔萨斯
  • 浏览: 4107737 次
社区版块
存档分类
最新评论

Wordpress-数据库结构分析

 
阅读更多

之前用了一段时间的Wordpress,觉得真的是一个优秀的博客系统,而且有大量的主题和插件。是我目前用过的最棒的一个博客平台。不仅如此,Wordpress 的代码也是写得非常漂亮,很适合用来学习PHP,真的是很好,看代码看起来很舒服。

打算深入研究一下Wordpress,顺便把我自己的学习经历也写下来,跟大家一起分享,有什么不对的地方,希望各位多多指点。(本人分析的是2.5版本的)

Wordpress对数据库的操作都是通过一个基于现有的数据库类来实现的:

// WordPress DB Class
// ORIGINAL CODE FROM:
// Justin Vincent (justin@visunet.ie)
// http://php.justinvincent.com

并且同时很多的数据库操作都封装成了函数,直接操作数据库的场合并不多。不过了解它的数据库结构,这样可以对它有个总体上的把握,也有利于源码的分析。

Wordpress官方的数据表介绍的文章,可以去看看:http://codex.wordpress.org/Database_Description

数据表的总体结构如下图(为了节约篇幅,这里仅列出了主键、外键及某些字段):

wordpress-db

wordpress仅仅用了 10 个 Table就实现了这么强大的系统,让我钦佩:

wp_comments
wp_links
wp_options
wp_postmeta
wp_posts
wp_term_relationships
wp_term_taxonomy
wp_terms
wp_usermeta
wp_users

下面我们按照它们之间的关系来介绍一下这几个表:

按照功能大致分为五类。

  • user: 用户信息,包括wp_users表和wp_usermeta表。
  • link:链接信息,包括wp_links表。
  • post: 文章及评论信息,包括wp_posts、wp_postmeta、wp_comments。
  • category,link_category,tag:这个是比较复杂的信息模块,它包含了对分类,链接分类,标签的管理,包括wp_term,wp_term_relationships和wp_term_taxonomy表。
  • option: 全局设置信息,包括wp_options表。

wp_posts
作为一个博客系统,最核心的当然是博主发表的一些“文章”了,这些“文章”存放的地方就是这个 wp_posts 表了。注意,这里所说的“文章”是加引号的,因为这个表里存放的除了普通的文章之外,还有附件和页面(page)的一些信息。表里面的 post_type 这个字段就是用来标示类型的。还有一点需要注意的就是,这个表里一些字段是针对于 post_type 的特定类型的,比如 menu_order 这个字段是“页面(page)”特有的,用来指定“页面”的顺序。post_mime_type 是针对附件的,来指定附件的类型。

wp_postmeta
每篇文章的属性是不可能仅仅用 wp_posts 表里的那几个字段来完全标示的,往往还有一些因人而异的属性:写这篇文章时候的心情,地点等等。这些属性的名称和值类型都是不确定的,因 此,Wordpress 采用了元信息(meta)来表示它们。这个表很简单,只有 meta_id, post_id, meta_key, meta_value 这四个字段。post_id 是相关 post 的 id。我们注意到 meta_value 是 longtext 类型的,这里仅是用来存储值,至于值的确切类型,需要程序员来关心。
在撰写文章的时候,我们可以发现编辑框下面有一个 Custom Fields 的选项,我们可以在这里添加 post 的 meta 信息。

wp_comments
用户评论。除了评论的内容以外,还记录了评论用户的名字,邮箱,网址,浏览器类型等信息。比较重要的两个字段是 comment_post_ID 和 comment_approved,前一个用来指示这条评论隶属于哪一篇文章,后一个用来记录审核状况。还有一个比较有意思的是这个 commnet_agent 字段,我们可以利用这个字段来统计一下用户浏览器类型。

wp_users
用户帐号表。存储用户名、密码还有一些用户的基本信息。

wp_usermeta
类似上面的 wp_postmeta,存储一些因人而异的用户信息。(比如QQ?ICQ?)

wp_options
用来记录 Wordpress 的一些设置和选项。里面有一个 blog_id 字段,这个应该是用在 MU 版里面来标示不同的 Blog 的。

wp_links
用来存储 Blogroll 里面的链接。

wp_terms
wp_term_relationships
wp_term_taxonomy

这三个表是这里面关系最复杂的了,在 Wordpress 2.2 及以前的版本中是没有这三个表的,代之的是 wp_categories、wp_post2cat 和 wp_link2cat 这三个表。对比这两个版本我们可以发现:在 2.2 版和之前的版本,post 和 link 和 category 的关系都是通过各自单独的表来记录的。而在 2.3 版中加入了 tag 的支持,Wordpress 把 post、link、tag 的分类都抽象成了统一的形式,用新的三个表来记录这些信息。
wp_terms
记录分类,链接分类,标签的一些简要信息,包括名称,缩写。

wp_term_taxonomy
是对wp_terms中的信息的关系信息补充,有所属类型(category,link_category,tag),详细描述,父类,所拥有文章(链接)数量。

wp_term_relationships
关系表,多对多的,object_id是与不同的对象关联,例如wp_posts中的ID(wp_links中的link_id)等,term_taxonomy_id就是关联wp_term_taxonomy中的term_taxonomy_id。

还有一些字段我还不太清楚是有什么用的,例如:
wp_term_relationships中的term_order;
wp_terms中的term_group,wp_option中的一些值作用等等,在以后学习的过程中再作详细的讲解吧,如果大家知道的,也可以告诉我。

在其他的文章中我看到有说虚表的,而且我在wpdb这个类中也看到了这样的声明:
// Our tables
var $posts;
var $users;
var $categories;
var $post2cat;
var $comments;
var $links;
var $options;
var $postmeta;
var $usermeta;
var $terms;
var $term_taxonomy;
var $term_relationships;
var $tables = array('users', 'usermeta', 'posts', 'categories', 'post2cat', 'comments', 'links', 'link2cat', 'options',
'postmeta', 'terms', 'term_taxonomy', 'term_relationships');
不知道上面的'categories', 'post2cat','link2cat'是不是虚表,还是为了兼容以前的版本用的,大家有什么看法的都尽管说说吧。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics