本站之前有写过介绍 WordPress 数据表的文章,为大家介绍了 WordPress 的数据表,以及哪个数据表存储哪种类型的数据,在本文中,我将为大家介绍这些数据在 WordPress 数据库中是怎么相互关联起来的。在开始之前,先说明一下数据表之间的几种关系,由于数据库关系是比较抽象的,我们用几种常见的社会关系来举例说明一下。
一对一:一个丈夫只能有一个妻子,一个妻子只能有一个丈夫。
一对多:一儿子只能有一个父亲,一个父亲可以有很多儿子。
多对多:一个老师可以有很多学生,一个学生也可以有很多老师。
以上 3 种数据库关系在 WordPress 中均有使用,那么这三种数据关系在 WordPress 中到底是怎么使用的呢?我们一起来看一下。
One-to-One 一对一关系
一对一关系是所有数据关系(男女关系也一样)中最简单的一种,一个数据对应另外一个数据,并且只对应另外一个数据,另外一个数据对这个数据也一样。
WordPress 中的一对一关系包括:
文章 ID 和文章内容
文章标题和文章内容
文章ID和文章标签
评论ID和评论内容
用户ID和用户名
这些数据往往在一个数据表中的同一行存储,其实这不是严格上的数据库中的一对一关系,为了方便大家理解,这里拿这些关系来举例子,大家能理解就好了。
一对一关系是最简单的,也是最基本的关系,我们不多说,在 WordPress 中,最重要,也是用得最多的是一对多关系。
One-to-Many 一对多关系
一对多关系在所有的数据库系统中都非常常见,正是因为这个一对多关系,数据库系统才变得强大起来,而不是像 Excel 中,数据只能是扁平化的。而这种强大和方便体现在一个数据有多个数据需要与其关联的时候。
在 WordPress 中,一对多关系通过唯一的 ID 在两个数据表中创建链接实现,post_id 在 wp_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_id, meta_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_id 和term_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 中的一对一、一对多、和多对多关系,可以帮助我们更好的在插件和主题中分析和处理数据。