性价比最高的香港ASP、PHP主机提供商
做网站,就上凡科建站

理解和利用 WordPress 中的数据关系

Loading
0
Comodo SLL证书促销 - 免费ssl证书申请_ssl证书购买_ev ssl证书_https证书购买 - GDCA_数安时代

在本系列的第一部分,我给出了WordPress数据库表的一个概览,以及哪个表是用于存储什么类型数据的介绍。在第二部分,将会介绍WordPress是如何管理数据之间的关系。

正如你看到的,WordPress使用了三种数据关系——一对一,一对多和多对多。我将会针对每一个进行介绍,了解它们在你的WordPress站点中的意义。

一对一关系

一对一是所有关系中最简单的——你可以简单地认为就是一条记录只对应另外一个。数据通常都保存在一张表中(尽管不全是这样的,我们将会在该教程的后面看到)。

WordPress中一对一关系的例子如下:

  • 文章ID和文章内容
  • 文章标题和文章内容
  • 文章ID和文章别名(slug)
  • 评论ID和评论内容
  • 用户ID和用户名

还可以列举出更多的例子,但主要想说明的是任何两条由不同的子段构成记录在一张表的一里行存储就是一对一的关系。

虽然,一对一关系是最无趣的一种数据库关系。但是,如果没有疑问的话让我们继续了解在WordPress使用广泛的——一对多关系。

一对多关系

一对多关系是在数据库中最常见的,这也使得它比“扁平的”表更强大,例如电子表格。当一条记录和不止一个记录有关系时就会用到。

在WordPress中,大多数一对多关系都是用来连接两个表的,并且通过一个唯一标示来连接。例如:post_id就是每篇文章在表wp_posts中的唯一标示,同时也是表wp_comments中每个评论的唯一标示。这意味着每个post_id在表wp_posts中只出现一次,而在表wp_comments中可能出现多次或在根本没有。

WordPress中的其他例子如下:

  • 文章和文章元数据
  • 文章和用户
  • 用户和用户元数据
  • 分类法和分类项目

同样地,还能继续列举。在 WordPress 中这是一个重要的话题,让我们继续了解一对多关系的细节吧。

涉及到文章的一对多关系

连接其他表最多的表是wp_posts,大多数关系都是一对多关系。

正如在下表中你看到的,wp_posts表连接了四个其他表:

多说一句啊,文章也可以和文章有一对多关系,在附件表单或在父页面时就是这样的。

文章和文章

正如上面解释的,存储在表wp_posts中的数据可以和相同表里的数据有一对多的关系;然而这个关系并不是你想象的和文章的关系,而是文章那个和附件或在页面或者其他页面的。总之,附件和页面也是文章类型。

附件保存在表wp_posts中,并使用post_parent子段来关联对应的文章ID(抱歉重复)。这就是一对多关系,因为一个附件只能有一个父,而每篇文章可能有多个附件。就算你通过多媒体管理器把附件添加到别的文章中,它的父也是原始添加的文章。

当一个页面是另外一个页面的父时,文章还跟其他的文章有一对多的关系。子页面的记录中,post_parent字段的值就是父页面的post_id字段。这就是一对多的关系,因为父页面可以有很多的子页面但是子页面只能有一个父页面。

就像这样,在考虑文章之间的关系时,考虑WordPress的数据处理时很重要的,文章不是你可能认为的那样被引用。它们包括页面,附件和其他类型的,所有都是保存在wp_posts表中。

文章和文章元数据

文章的元数据保存在它自己的表wp_postmeta中。这个表只有4个字段——post_id,meta_id,还有键值对。一篇文章可以关联很多元数据,但是每个元数据记录只能关联到一篇文章中。

文章和评论

评论也有自己的表wp_comments。每个评论只能关联到一篇文章,但是一篇文章却可以有很多评论。就像所有的其他表关联到wp_posts一样,post_id字段就是用来作关联的(wp_comments中的comment_post_id字段)。

默认情况下wp_comments有15个字段,保存了作者,作者的邮件(email)地址,以及评论自身的内容和它的批准状态。它还关联到了表wp_users,具体内容我们会在下一个章节中介绍到。

评论也有它自己的的元数据,存储在其他表中,我很快会介绍到。

文章和用户

每篇文章通过user_id字段关联到wp_users表,保存在表wp_posts的post_author字段中。这是一对多的关系,因为每篇文章只有一个作者,但是每个用户可以有多篇文章。

文章和用户之间的关系是不同于文章和评论或在元数据的,因为很自然地,一个用户可以有多篇文章,但一篇文章有多个评论或者元数据不同。这就是为什么使用user_id字段而不是post_id来进行关联的原因。

不涉及文章的一对多关系

还有三个一对多的关系,但是和文章没关系。其中的两个是有元数据有关系——评论和它对应的元数据,用户和它对应的元数据。

用户和用户元数据

WordPress把用户附加的元数据信息保存到wp_usermeta表中。这通常用户非标准的用户信息,例如在一个多站点版本中的超级管理员和管理员对用户的颜色设置信息。

用户的大多数数据保存在表wp_users中。这两个表是通过user_id字段和用户拥有多个元数据尽心关联的,每个元数据都会设置到一个用户上。

评论和评论元数据

同样地,有关评论自身的大多数数据都保存在表wp_comments中。但是wp_commentmeta表用来保存附加的元数据的,例如插件Akismet创建的数据。这个关系就像用户和用户元数据的关系一样。

评论和用户

最后的一对多关系是评论和用户的。 表wp_comments包括user_id字段,当一个已经登陆的用户添加一条评论后就会把用户的ID保存进去。记住,这个字段不适用于没有登陆的用户。

多对多关系

数据库中的最后一种类型是多对多关系,也就是说在两边都有连接。在WordPress中只用了一次,在分类系统中(包括分类和标签都是简单的分类方法)。一篇文章可以有很多分类而且一个分类也可以用到多篇文章中。

WordPress创建这个关系和其他数据创建多对多关系一样:通过一个关系表来连接两个表。就是wp_term_relationships表,连接了表wp_posts和wp_term_taxonomy表。

备注:这个表也连接了表 wp_links 和 wp_term_taxonomy,这种连接的方法和连接文章的一样——我很快就会介绍到。

通过查看这两个表最容易解释。表wp_posts包含每篇文章的数据,表wp_term_taxonomy包含每个分类的数据,包括分类和它自身的ID。

为了创建表wp_term_taxonomy和表wp_posts的文章,WordPress在表wp_term_relationships中添加了一条记录,包含post_id和term_id(保存在表wp_term_relationships的object_id字段和term_taxonomy_id字段中)。这意味着表wp_term_relationships能够包含多条文章记录和多条分类记录,也就是多对多的关系。

下图展示了它是如何运行的:

working-with-data-in-wordpress-terms-to-posts-relationships

在上面的例子,文章有下面的分类:

  • 文章 1 有分类 1 和 3
  • 文章 2 有分类 2
  • 文章 3 有分类 4
  • 文章 4 有分类 1 和 3

你也可以从另外一个角度来看——例如,分类3关联了文章1和4.

然而,还没有结束。还有第四个表,wp_terms。这里保存了每个分类,命名,和分类描述的数据。每个分类在表wp_terms中只有一条记录,它和表wp_term_txonomy是真正的一对一关系。理论上讲,这个数据没有理由保存在表wp_term_taxonomy中,但不是这样的。

有关链接需要注意的

链接或者友情链接,这个WordPress的特色已经不如以前那么重要了。事实上,从3.5版本链接在后台就已经被默认关闭了;然而,它们还有自己的表wp_links。

它相对于wp_posts表来说是很简单的。毕竟,链接这种内容类型相对文章来说非常简单,它同样和分类有多对多的关系。

总结

正如我们看到的,WordPress有11个表中的10个表都有连接关系。唯一没有提到的表就是wp_options,因为它和其他表都没有关系,它只是简单地保存关于站点而不是内容的数据。我将会在该系列的后续部分介绍它的细节。

通过理解WordPress中的一对一,一对多,和多对多关系,可以帮助你修改数据以及在你的主题或者插件中写自定义的查询语句。

在该系列的下一个部分中,我将会更加详细地介绍内容类型,查找WordPress数据库中保存的内容类型,比较它们之间的相同点和不同点。

原文出自:http://code.tutsplus.com/tutorials/understanding-and-working-with-relationships-between-data-in-wordpress–cms-20632

由 surenpi.com@wordpress大学 原创翻译,未经允许,禁止转载和采用本译文。

阅读该系列的其他文章:
上一篇:理解和利用 WordPress 中的数据(介绍)
下一篇:理解和利用 WordPress 中的内容类型
MetInfo | 最适合企业网站建设的cms系统

关于 surenpi.com

该用户很懒,还没有介绍自己。

发表评论