深入理解 WordPress 数据库中的数据关系

分类:资讯 热度:

深入理解 WordPress 数据库中的数据关系

本站之前有写过介绍 WordPress 数据表的文章,为大家介绍了 WordPress 的数据表,以及哪个数据表存储哪种类型的数据,在本文中,我将为大家介绍这些数据在 WordPress 数据库中是怎么相互关联起来的。在开始之前,先说明一下数据表之间的几种关系,由于数据库关系是比较抽象的,我们用几种常见的社会关系来举例说明一下。

  • 一对一:一个丈夫只能有一个妻子,一个妻子只能有一个丈夫。
  • 一对多:一儿子只能有一个父亲,一个父亲可以有很多儿子。
  • 多对多:一个老师可以有很多学生,一个学生也可以有很多老师。

以上 3 种数据库关系在 WordPress 中均有使用,那么这三种数据关系在 WordPress 中到底是怎么使用的呢?我们一起来看一下。

一对一关系是所有数据关系(男女关系也一样)中最简单的一种,一个数据对应另外一个数据,并且只对应另外一个数据,另外一个数据对这个数据也一样。

WordPress 中的一对一关系包括:

  • 文章 ID 和文章内容
  • 文章标题和文章内容
  • 文章ID和文章标签
  • 评论ID和评论内容
  • 用户ID和用户名

这些数据往往在一个数据表中的同一行存储,其实这不是严格上的数据库中的一对一关系,为了方便大家理解,这里拿这些关系来举例子,大家能理解就好了。

一对一关系是最简单的,也是最基本的关系,我们不多说,在 WordPress 中,最重要,也是用得最多的是一对多关系。

一对多关系在所有的数据库系统中都非常常见,正是因为这个一对多关系,数据库系统才变得强大起来,而不是像 Excel 中,数据只能是扁平化的。而这种强大和方便体现在一个数据有多个数据需要与其关联的时候。

在 WordPress 中,一对多关系通过唯一的 ID 在两个数据表中创建链接实现,post_idwp_posts 数据表中代替了每一篇文章。在评论数据表 wp_comments 中,post_id 被用来判断评论是发表在那篇文章的。这就意味着,每一个文章 ID 只能在每篇文章中出现一次,却可以在这篇文章的评论中出现多次,如果这篇文章没有评论,那么这个文章 ID 一次也不会出现。

在 WordPress 中,其他类似的例子如下:

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

此外,还有很多这样的关系,在这里就不一一列举了。

链接最多的数据表是 wp_posts 数据表, 而几乎所有的链接都是一对多关系。如下表,wp_posts 链接了4个不同的数据表。

文章可以和其他文章产生一对多关系,文章的附件和上级文章就是通过这种关系产生的。

下面我们就来深入看一下文章和文章的多对多关系。

像上面提到的,在 wp_posts 数据表中存储的数据可以和自身建立一对多的关系,然而,这种关系的体现不是字面意义上的文章与文章的关系,而是文章和附件,页面与页面之间的关系,附件和页面也是文章类型。

文章附件在wp_posts 数据表中以 post_parent字段保存,字段的值为附件文章的 ID (有点绕)。这是一个一对多的关系,一个附件记录只能有一个 post parent 字段,而一片文章却可以有很多附件,

文章也可以有一对多的关系,一个页面可以是另外几个页面的父级页面,这种关系存储在 post_parent 字段, – 值为父级文章的 post_id,一个父级页面可以有很多子页面,而一个子页面只能有一个父级页面。

在 WordPress 中考虑数据关系时,文章不是字面意义上的文章,也包含页面,附件和其他自定义文章类型。

文章对文章元数据

文章自定义字段存储在他自己数据 wp_postmeta中,该数据表只包含了4个字段, 分别是 post_idmeta_id, meta_key 和 meta_value.一篇文章可以包含多个自定义字段,而一条自定义字段却只能对应一篇文章。

评论也有自己的数据表 wp_comments。 每条评论只能对应一篇文章,而一篇文章却可以有很多条评论。和其他链接到 wp_posts数据表的数据一样, 数据表也使用文章 ID 链接到文章数据表。

wp_comments 数据表默认有 15 个字段,用来保存作者,作者邮件地址,评论信息和审核状态,该数据表同时也链接到 wp_users 数据表。

评论也有自己的元数据,存储在另外一个表中。

文章对用户

每篇文章附加到 wp_users 表中, 通过 user_id 记录,存储的字段名称为 post_author字段,wp_posts,这是一个一对多的关系,一篇文章只能有一个作者,而一个作者可以发表多篇文章。

文章和作者之间的关系和文章与评论之间的关系不太一样,文章是一个作者,多篇文章,主表是作者,而评论与元数据是一篇文章,主表是文章,多个评论或元数据。

这就是为什么文章通过 user_id 来维系链接,而不是 post_id 字段。

文章之外的一对多关系

除了文章之外,还有 3 种一对多关系,两种是评论和他的元数据,一种是用户和他的元数据。

用户对用户元数据

WordPress 把关于用户的附加数据存储在 wp_usermeta 数据表中,这个表通常用来存储一些非核心的 WordPress 数据,例如仪表盘配色,用户联系方式等。

WordPress 用户的核心数据存储在 wp_users 数据表中,这两个表通过user_id 字段相连接,一个用户可以有很多元数据信息,一个元数据信息只能对应一个用户。

评论对评论元数据

评论的核心数据存储在 wp_comments 数据表中,附加数据存储在 wp_commentmeta 数据表中,用来存储一些额外的评论信息,比如评论来源,评论插件创建的评论点赞数量等,这种关系和用户和用户元数据的关系类似。

评论对用户

最后一个一对多关系是评论和用户之间的关系,wp_comments 数据表中有一个 user_id 字段,当发表评论的用户是已登录用户时,该字段用来存储发表评论的用户 ID。当评论作者没有登录时,该字段为空。

Many-to-Many 多对多关系

WordPress 中最后一种数据库关系是多对多关系,这种关系在 WordPrss 中只使用了一次,就是分类法项目(包括默认的分类目录和标签、自定义分类法项目),一篇文章可以有多个分类,同时,一个分类里面也可以有多篇文章。

和其他应用的数据表一样,WordPress 通过一个额外的数据表来实现这种关系,这就是 wp_term_relationships 数据表,该数据表通过连个表的记录 ID 链接了 wp_posts数据表和 wp_term_taxonomy 数据表。

其实这很好理解 wp_posts 数据表包含着每条文件的数据, wp_term_taxonomy 数据表包含着文章与分类的关系,包含分类法项目和他的 ID,把文章 ID 和分类法项目 ID 对应起来,就建立了多对多关系。

为了创建 wp_term_taxonomy 数据表的中记录和wp_posts 数据表中的文章,WordPress 在wp_term_relationships表中添加了一条记录,该记录包含了post_id 和 term_id (以object_idterm_taxonomy_id 的方式分别保存在 wp_term_relationships 表中)。这意味着wp_term_relationships 表可以为文章记录很多条数据,同时也可以为分类法项目记录很多篇文章,文章和分类之间的方式就是这样建立起来的。

用图表的方式表现出来就是:

WordPress 文章和分类项目之前的关系
WordPress 文章和分类项目之前的关系

在上面的示例中:
  • 文章 1 有 1 和 3
  • 文章 2 有 2
  • 文章 3 有 4
  • 文章 4 有 1 and 3

你也可以换个方式看这个表,比如分类项目3包含文章1和4。

别急着兴奋,到这里还没完,还有第四个数据表—— wp_terms ,这个表保存这关于分类法项目的信息,也就是分类名称,别名和描述,每个分类法项在 wp_terms 数据表中只有一条记录,也就是说,这个表和 wp_term_taxonomy 数据表是一对一关系,实际上,这个表的数据可以直接放到 wp_term_taxonomy数据表中,但是 WordPress 没有这么做,可能是为了让数据结构更加清晰的原因吧。

如我们所见,WordPress 在11个数据表中,有10个数据表都是相互关联的,唯一没有和其他数据表关联的表是 wp_options数据表,因为该表存储的是关于网站的数据,而不是网站的内容,关于该表的详细介绍,我将抽时间单独为大家分析。

通过理解 WordPress 中的一对一、一对多、和多对多关系,可以帮助我们更好的在插件和主题中分析和处理数据。

上一篇:深入理解 WordPress 文章数据表 wp_posts 下一篇:在 WordPress 4.4 中恢复”获取短链接地址” 按钮的
猜你喜欢
热门排行
精彩图文