文本是《理解和利用 WordPress 中的數(shù)據(jù)(共9篇)》專題的第 2 篇。閱讀本文前,建議先閱讀前面的文章:
在本系列的第一部分,我給出了WordPress數(shù)據(jù)庫表的一個(gè)概覽,以及哪個(gè)表是用于存儲什么類型數(shù)據(jù)的介紹。在第二部分,將會介紹WordPress是如何管理數(shù)據(jù)之間的關(guān)系。
正如你看到的,WordPress使用了三種數(shù)據(jù)關(guān)系——一對一,一對多和多對多。我將會針對每一個(gè)進(jìn)行介紹,了解它們在你的WordPress站點(diǎn)中的意義。
一對一關(guān)系
一對一是所有關(guān)系中最簡單的——你可以簡單地認(rèn)為就是一條記錄只對應(yīng)另外一個(gè)。數(shù)據(jù)通常都保存在一張表中(盡管不全是這樣的,我們將會在該教程的后面看到)。
WordPress中一對一關(guān)系的例子如下:
- 文章ID和文章內(nèi)容
- 文章標(biāo)題和文章內(nèi)容
- 文章ID和文章別名(slug)
- 評論ID和評論內(nèi)容
- 用戶ID和用戶名
還可以列舉出更多的例子,但主要想說明的是任何兩條由不同的子段構(gòu)成記錄在一張表的一里行存儲就是一對一的關(guān)系。
雖然,一對一關(guān)系是最無趣的一種數(shù)據(jù)庫關(guān)系。但是,如果沒有疑問的話讓我們繼續(xù)了解在WordPress使用廣泛的——一對多關(guān)系。
一對多關(guān)系
一對多關(guān)系是在數(shù)據(jù)庫中最常見的,這也使得它比“扁平的”表更強(qiáng)大,例如電子表格。當(dāng)一條記錄和不止一個(gè)記錄有關(guān)系時(shí)就會用到。
在WordPress中,大多數(shù)一對多關(guān)系都是用來連接兩個(gè)表的,并且通過一個(gè)唯一標(biāo)示來連接。例如:post_id就是每篇文章在表wp_posts中的唯一標(biāo)示,同時(shí)也是表wp_comments中每個(gè)評論的唯一標(biāo)示。這意味著每個(gè)post_id在表wp_posts中只出現(xiàn)一次,而在表wp_comments中可能出現(xiàn)多次或在根本沒有。
WordPress中的其他例子如下:
- 文章和文章元數(shù)據(jù)
- 文章和用戶
- 用戶和用戶元數(shù)據(jù)
- 分類法和分類項(xiàng)目
同樣地,還能繼續(xù)列舉。在 WordPress 中這是一個(gè)重要的話題,讓我們繼續(xù)了解一對多關(guān)系的細(xì)節(jié)吧。
涉及到文章的一對多關(guān)系
連接其他表最多的表是wp_posts,大多數(shù)關(guān)系都是一對多關(guān)系。
正如在下表中你看到的,wp_posts表連接了四個(gè)其他表:

多說一句啊,文章也可以和文章有一對多關(guān)系,在附件表單或在父頁面時(shí)就是這樣的。
文章和文章
正如上面解釋的,存儲在表wp_posts中的數(shù)據(jù)可以和相同表里的數(shù)據(jù)有一對多的關(guān)系;然而這個(gè)關(guān)系并不是你想象的和文章的關(guān)系,而是文章那個(gè)和附件或在頁面或者其他頁面的。總之,附件和頁面也是文章類型。
附件保存在表wp_posts中,并使用post_parent子段來關(guān)聯(lián)對應(yīng)的文章ID(抱歉重復(fù))。這就是一對多關(guān)系,因?yàn)橐粋€(gè)附件只能有一個(gè)父,而每篇文章可能有多個(gè)附件。就算你通過多媒體管理器把附件添加到別的文章中,它的父也是原始添加的文章。
當(dāng)一個(gè)頁面是另外一個(gè)頁面的父時(shí),文章還跟其他的文章有一對多的關(guān)系。子頁面的記錄中,post_parent字段的值就是父頁面的post_id字段。這就是一對多的關(guān)系,因?yàn)楦疙撁婵梢杂泻芏嗟淖禹撁娴亲禹撁嬷荒苡幸粋€(gè)父頁面。
就像這樣,在考慮文章之間的關(guān)系時(shí),考慮WordPress的數(shù)據(jù)處理時(shí)很重要的,文章不是你可能認(rèn)為的那樣被引用。它們包括頁面,附件和其他類型的,所有都是保存在wp_posts表中。
文章和文章元數(shù)據(jù)
文章的元數(shù)據(jù)保存在它自己的表wp_postmeta中。這個(gè)表只有4個(gè)字段——post_id,meta_id,還有鍵值對。一篇文章可以關(guān)聯(lián)很多元數(shù)據(jù),但是每個(gè)元數(shù)據(jù)記錄只能關(guān)聯(lián)到一篇文章中。
文章和評論
評論也有自己的表wp_comments。每個(gè)評論只能關(guān)聯(lián)到一篇文章,但是一篇文章卻可以有很多評論。就像所有的其他表關(guān)聯(lián)到wp_posts一樣,post_id字段就是用來作關(guān)聯(lián)的(wp_comments中的comment_post_id字段)。
默認(rèn)情況下wp_comments有15個(gè)字段,保存了作者,作者的郵件(email)地址,以及評論自身的內(nèi)容和它的批準(zhǔn)狀態(tài)。它還關(guān)聯(lián)到了表wp_users,具體內(nèi)容我們會在下一個(gè)章節(jié)中介紹到。
評論也有它自己的的元數(shù)據(jù),存儲在其他表中,我很快會介紹到。
文章和用戶
每篇文章通過user_id字段關(guān)聯(lián)到wp_users表,保存在表wp_posts的post_author字段中。這是一對多的關(guān)系,因?yàn)槊科恼轮挥幸粋€(gè)作者,但是每個(gè)用戶可以有多篇文章。
文章和用戶之間的關(guān)系是不同于文章和評論或在元數(shù)據(jù)的,因?yàn)楹茏匀坏兀粋€(gè)用戶可以有多篇文章,但一篇文章有多個(gè)評論或者元數(shù)據(jù)不同。這就是為什么使用user_id字段而不是post_id來進(jìn)行關(guān)聯(lián)的原因。
不涉及文章的一對多關(guān)系
還有三個(gè)一對多的關(guān)系,但是和文章沒關(guān)系。其中的兩個(gè)是有元數(shù)據(jù)有關(guān)系——評論和它對應(yīng)的元數(shù)據(jù),用戶和它對應(yīng)的元數(shù)據(jù)。
用戶和用戶元數(shù)據(jù)
WordPress把用戶附加的元數(shù)據(jù)信息保存到wp_usermeta表中。這通常用戶非標(biāo)準(zhǔn)的用戶信息,例如在一個(gè)多站點(diǎn)版本中的超級管理員和管理員對用戶的顏色設(shè)置信息。
用戶的大多數(shù)數(shù)據(jù)保存在表wp_users中。這兩個(gè)表是通過user_id字段和用戶擁有多個(gè)元數(shù)據(jù)盡心關(guān)聯(lián)的,每個(gè)元數(shù)據(jù)都會設(shè)置到一個(gè)用戶上。
評論和評論元數(shù)據(jù)
同樣地,有關(guān)評論自身的大多數(shù)數(shù)據(jù)都保存在表wp_comments中。但是wp_commentmeta表用來保存附加的元數(shù)據(jù)的,例如插件Akismet創(chuàng)建的數(shù)據(jù)。這個(gè)關(guān)系就像用戶和用戶元數(shù)據(jù)的關(guān)系一樣。
評論和用戶
最后的一對多關(guān)系是評論和用戶的。 表wp_comments包括user_id字段,當(dāng)一個(gè)已經(jīng)登陸的用戶添加一條評論后就會把用戶的ID保存進(jìn)去。記住,這個(gè)字段不適用于沒有登陸的用戶。
多對多關(guān)系
數(shù)據(jù)庫中的最后一種類型是多對多關(guān)系,也就是說在兩邊都有連接。在WordPress中只用了一次,在分類系統(tǒng)中(包括分類和標(biāo)簽都是簡單的分類方法)。一篇文章可以有很多分類而且一個(gè)分類也可以用到多篇文章中。
WordPress創(chuàng)建這個(gè)關(guān)系和其他數(shù)據(jù)創(chuàng)建多對多關(guān)系一樣:通過一個(gè)關(guān)系表來連接兩個(gè)表。就是wp_term_relationships表,連接了表wp_posts和wp_term_taxonomy表。
備注:這個(gè)表也連接了表 wp_links 和 wp_term_taxonomy,這種連接的方法和連接文章的一樣——我很快就會介紹到。
通過查看這兩個(gè)表最容易解釋。表wp_posts包含每篇文章的數(shù)據(jù),表wp_term_taxonomy包含每個(gè)分類的數(shù)據(jù),包括分類和它自身的ID。
為了創(chuàng)建表wp_term_taxonomy和表wp_posts的文章,WordPress在表wp_term_relationships中添加了一條記錄,包含post_id和term_id(保存在表wp_term_relationships的object_id字段和term_taxonomy_id字段中)。這意味著表wp_term_relationships能夠包含多條文章記錄和多條分類記錄,也就是多對多的關(guān)系。
下圖展示了它是如何運(yùn)行的:

在上面的例子,文章有下面的分類:
- 文章 1 有分類 1 和 3
- 文章 2 有分類 2
- 文章 3 有分類 4
- 文章 4 有分類 1 和 3
你也可以從另外一個(gè)角度來看——例如,分類3關(guān)聯(lián)了文章1和4.
然而,還沒有結(jié)束。還有第四個(gè)表,wp_terms。這里保存了每個(gè)分類,命名,和分類描述的數(shù)據(jù)。每個(gè)分類在表wp_terms中只有一條記錄,它和表wp_term_txonomy是真正的一對一關(guān)系。理論上講,這個(gè)數(shù)據(jù)沒有理由保存在表wp_term_taxonomy中,但不是這樣的。
有關(guān)鏈接需要注意的
鏈接或者友情鏈接,這個(gè)WordPress的特色已經(jīng)不如以前那么重要了。事實(shí)上,從3.5版本鏈接在后臺就已經(jīng)被默認(rèn)關(guān)閉了;然而,它們還有自己的表wp_links。
它相對于wp_posts表來說是很簡單的。畢竟,鏈接這種內(nèi)容類型相對文章來說非常簡單,它同樣和分類有多對多的關(guān)系。
總結(jié)
正如我們看到的,WordPress有11個(gè)表中的10個(gè)表都有連接關(guān)系。唯一沒有提到的表就是wp_options,因?yàn)樗推渌矶紱]有關(guān)系,它只是簡單地保存關(guān)于站點(diǎn)而不是內(nèi)容的數(shù)據(jù)。我將會在該系列的后續(xù)部分介紹它的細(xì)節(jié)。
通過理解WordPress中的一對一,一對多,和多對多關(guān)系,可以幫助你修改數(shù)據(jù)以及在你的主題或者插件中寫自定義的查詢語句。
在該系列的下一個(gè)部分中,我將會更加詳細(xì)地介紹內(nèi)容類型,查找WordPress數(shù)據(jù)庫中保存的內(nèi)容類型,比較它們之間的相同點(diǎn)和不同點(diǎn)。
由 surenpi.com@wordpress大學(xué) 原創(chuàng)翻譯,未經(jīng)允許,禁止轉(zhuǎn)載和采用本譯文。
您已閱讀完《理解和利用 WordPress 中的數(shù)據(jù)(共9篇)》專題的第 2 篇。請繼續(xù)閱讀該專題下面的文章:





