WordPress数据库系列:理解和使用WordPress中的数据系列二(数据间的关系)

这是我参与更文挑战的第12天,活动详情查看: 更文挑战

本篇翻译参考自Understanding and Working with Relationships Between Data in WordPress
它是理解和使用WordPress中的数据系列的第二篇

理解和使用WordPress中数据之间的关系

在系列的第一部分,作者给出了WordPress数据库表的概览,及哪些表用于存储哪种数据。第二部分将介绍WordPress如何管理数据之间关系

如你所见,WordPress使用三种类型的数据关系——一对一、一对多和多对多。下面会对每一个进行介绍,以及它们对WordPress站点的意义。

一对一关系——One-to-One Relationships

一对一的关系是最简单的关系——它仅仅意味着一条记录和另一条相关。这样的数据通常存储在一个表中(尽管并非总是如此,我们将在本教程的后面看到)

WordPress中的一对一关系示例包括:

  • post ID 和 post content
  • post title 和 post content
  • post ID 和 post slug
  • comment ID 和 comment content
  • user ID 和 username

该列表还可以继续,但是要点是,存储在表的一行中不同字段的任何两个记录都具有一对一的关系。

但是,一对一关系是最无趣的一种数据库关系。因此,让我们继续介绍一种WordPress常用的一对多关系类型。

一对多的关系——One-to-Many Relationships

一对多的关系在数据库中非常常见,并且它使得一个数据库比类似电子表格等”扁平的”表更强大。当一个记录和多个其他记录有关系时就会用到。

在WordPress中,大多数一对多关系是通过两个数据库表之间的链接创建的,使用唯一的标识符将两者连接在一起。例如,post_id记录对于wp_posts表中存储的每个post都是唯一的,但是在wp_comments表中post_id还用于标识每个评论发布到哪个post。这意味着每个post_id值在wp_posts表中只会出现一次,但在wp_comments表中可能会出现多次(或根本不会出现)。

在WordPress中的例子包括:

  • posts 和 post metadata
  • posts 和 users
  • users 和 user metadata
  • taxonomies 和 taxonomy terms
  • taxonomy terms 和 term metadata

同样,这个列表还可以有更多。因为在WordPress中这是一个重要的主题,让我们详细查看下一对多的关系。

有关Posts的一对多关系

Posts对应wp_posts表,它与大多数表关联,关联的关系大多数都是一对多的关系。

如下关系图,wp_posts表链接这4个其他表

除此之外,posts还可以与其他posts建立一对多的关系,比如通过附件(attachments)或父页面(parent pages)的形式。

Posts与Posts——Posts-to-Posts

如上所述,存储在wp_posts表中的数据可以与同一表中的其他数据具有一对多的关系。但是,这种关系不是通常认为的文章之间的关系,而是文章和附件或页面和其他页面之间的关系。

毕竟,附件和页面也是post type。文章、附件、页面和自定义文章类型(custom post type)都属于Posts,只是类型不同

存储在wp_posts表中的附件将在post_parent字段中有一条记录,该记录将是附件所附加到的post的ID(为造成重复,深表歉意!)。这是一对多的关系,因为每个附件只有一个父post,而每个post可能有许多附件。即使已经使用媒体管理器将附件添加到另一个帖子中,这也将适用——仅将最初添加该附件的post作为其父级存储在数据库中。

当将一个页面指定为另一页面的父页面时,Posts也可以与其他Posts具有一对多的关系。记录存储在子页面的post_parent字段中,其值为父页面的post_id。这是一对多的关系,因为父页面可以有很多子页面,但是子页面只有一个父页面。

在考虑这样的posts之间的关系时,请务必记住,进行WordPress数据处理时,posts不是通常所说的”文章”,它们包括页面,附件和其他文章类型,所有这些都存储在wp_posts表中。

Posts和Post元数据——Posts-to-Post Metadata

post元数据存储在自己的表wp_postmeta中。该表仅包含四个字段:post_idmeta_idkeyvalue。一个post可以具有与之关联的很多post元数据项,但是每个post元数据记录将仅链接到一个post。

Posts和评论——Posts-to-Comments

评论也有自己的表wp_comments。每个评论仅与一个post相关,而每个post可以对应多个评论。与链接到wp_posts的所有其他表一样,post_id字段用于链接(wp_commentscomment_post_id字段)。

wp_comments表默认具有15个字段,用于存储有关作者、作者的电子邮件、评论本身及其批准状态的数据。它也链接到wp_users表,在下一节中将会看到。

评论也有自己的元数据,存储在另一个表中,稍后将介绍到。

Posts和Users——Posts-to-Users

每个post都通过user_id附加到wp_users表,该记录存储在wp_posts中的post_author字段中。这是一对多的关系,因为每个post只有一个作者,但是每个用户都可以是多个post的作者。

post和user之间的关系与post和评论或元数据之间的关系有所不同,因为其性质是一个用户多个post,而不是一个post多个评论或元数据记录。这就是为什么是user_id字段而不是post_id提供链接的原因。

非Posts的一对多关系

还有三个与posts无关的一对多的关系。其中两个和元数据有关:评论(comments)和其元数据、用户和其元数据之间的关系。

用户和用户元数据——Users-to-User Metadata

WordPress在wp_usermeta表中存储用户额外的元数据。通常用于有关用户的非标准数据,例如多站点安装中关于超级管理员(superadmins)的元数据、用户选择的管理后台颜色(如果不是默认的)的元数据。

用户的数据通常存储在wp_users表中。两表的链接通过user_id字段,一个用户记录有多个关联的元数据项;而一个元数据项仅仅应用到一个用户。

评论和评论元数据——Comments-to-Comment Metadata

同样的,评论的大多数数据存储在wp_comments表中,但是wp_commentmeta表可以存储额外的元数据,比如Akismet插件中的创建时间。

它们的关系与用户和用户元数据之间的关系一样。

评论和用户——Comments-to-Users

最后一对多关系是评论和用户。wp_comments表包括user_id字段,它用于存储发表评论的登陆用户的用户ID。注意,对于无需用户登录也能评论的站点,此字段不是强制性的。

term和term Metadata

wp_termmeta表中存储term的元数据,类似的,一个term有多个元数据。

多对多关系

post和term

数据库关系的最后一种类型是多对多关系,其中许多链接都是双向的(the many link goes both ways)。它仅在WordPress中用到了一次:分类法项——taxonomy terms(包括分类目录和标签,它们是简单的分类法)。

一个post可以分配多个分类法项(many terms),一个分类法项(one term)可以分配给多个post。

WordPress创建多对多的关系,与其他数据库实现的方式相同:通过使用临时表链接两个表中的关键数据。即wp_term_relationships表,它将wp_posts表链接到wp_term_taxonomy表。

注意:该表还将wp_links表链接到wp_term_taxonomy表,因为links的行为与posts大致相同-我将在稍后介绍链接。

首先查看两个外围表可以很容易地解释这一点。 wp_posts表包含每个post的数据,而wp_term_taxonomy表包含每个分类项(term)的数据,包括其所属的分类法及ID(wp_term_taxonomy包含”term_taxonomy_id”、”term_id”、”分类法taxonomy“、”description”和parent,其中”term_taxonomy_id”和”term_id”相同,因为”term_id”本身在wp_trems表中就是主键唯一,其与taxonomy的组合作为唯一,完全可以使用与term_id相同的值,因此可以在很多查找的资料中看到,term_taxonomy_id作为term_id使用,但是其含义应该清除)。

为了在wp_term_taxonomy表中的term与wp_posts表中的post之间建立链接,WordPress会在wp_term_relationships表中创建一条记录,其中包括post_idterm_id(分别存储为wp_term_relationships表中的object_idterm_taxonomy_id)。这意味着wp_term_relationships表可以包含每个post的多个记录和每个term的多个记录,从而创建多对多关系。

下图显示了它是如何工作的:

在此示例中,post具有以下term:

  • post 1有terms 1 和 3
  • post 2有term 2
  • post 3有term 4
  • post 4有terms 1 和 3

也可以从另一个角度查看——例如,term 3关联posts 1和4。

但是,事情并没有就此止步。第四个表是wp_terms表。它保存每个term的数据,即每个term的name, slug和description。每个term在wp_terms表中只有一条记录,因此该term与wp_term_taxonomy表之间的关系实际上是一对一的。从理论上讲,没有理由不能将数据保留在wp_term_taxonomy表中,但事实并非如此。

在WP4.2版本之前,不同的taxonomy可以共用一个term,但这样会导致删除及其他的问题,因此后面修正了该问题,即terms共享拆分,保持term和wp_term_taxonomy一对一。

链接说明

Link(即Blogroll)是WordPress的一项功能,远没有以前那么突出。实际上,默认从3.5版本开始,链接已在管理员中关闭;但是,它们确实有自己的表:wp_links表。

它与wp_posts表非常相似。毕竟,链接是一种与post非常相似的内容类型,并且与分类法项(term)具有相同的多对多关系。

概要

如我们看到的,WordPress使用多种关系链接12表中的11个表的数据。唯一没有提到的表示wp_options,因为它没有链接到任何其他表,它仅仅存储关于站点的数据而不是内容数据,本系列的后面将进行详细介绍。

通过理解WordPress中一对一、一对多、多对多的关系,可以帮助你确定操作数据的方式和在主题或插件中编写自定义查询。

本系列的下一部分,将更详细地介绍内容类型、研究存储在WordPress数据库中的内容类型以及两者之间的相同点和不同点、

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享