首頁‎ > ‎電子期刊‎ > ‎2008年4月號‎ > ‎

MediaWiki資料庫綱要(上)


前言

在本文中分享MediaWiki的資料庫網要,這個主題對於想要進階瞭解MediaWiki架構的讀者會是相當有幫助的主題,瞭解了MediaWiki的資料庫網要後您可以做什麼呢?

首先就是您可以根據您的需求來拮取出在MediaWiki中您需要的資料,將取出來的資料與您的應用程式進行整合,例如可以呈現在.NET Framework上的程式,或是在Excel上呈現;更進階一點在您徹底瞭解資料庫的架構後,您可以將自己的資料運用SQL語法直接寫入資料庫,來將您 的系統與MediaWiki來做更緊密的結合。

本文撰寫的方式,並不會針對每個表格及每個欄位都進行深入的解釋,而是針對應用系統整合的角度,哪些MediaWiki您常會接觸到的資料,來介紹對應的資料表及欄位。

要能理解本文內容並且能應用的,需要的基礎還不少,需要有MediaWiki的觀念、PHP及MySQL的觀念,甚至還需一些Linux的觀念;然而,有了這些觀念後要瞭解本文也是相當容易,所以本文難在的是它所需要的基礎。

首先我們看到在MediaWiki網站上的兩個連結,一個連結是MediaWiki的資料表格說明,另一個是資料庫的示意圖;本文參考了以下許多的內容。

頁面表格

為了理解容易,我們把MeidaWiki的資料庫表格分類來討論,這節"馬上"就進入重頭戲,直接討論MediaWiki當中最重要的頁面資料表格;底下列出和頁面相關的表格,在除了文字說明之外,最重要的是要瞭解MediaWiki當中表格間的關係。

我們先從Page table開始看起,這是存放Wiki頁面的資訊,例如頁面名稱,在這個表格裡不會儲存頁面的內容,因為一個頁面會有很多的版本;腦筋動的快的讀者可能就會馬上想,那麼頁面實際的資料是放在Revision table裡面對不對?

也錯了,實際的資料是放在Text table當中,那您可能又會進階再問,那為何會放在Text table當中,而不是Revision talbe當中?原因在於不同的版本可能會參照到相同的內容,會有這種情況發生,比如後來的人在編輯時只能加了版本的註解,就可能會參照到相同的內容卻是 不同的版本,至於實際還有哪些狀況,這部份可能要詳細的追查MediaWiki的原始碼才知道。

上述的討論我們條列如下:

  • Page table與Revision table為一對多的關係,一個頁面會有很多的版本。
  • Text table與Revision table為一對多的關係,多個版本可能會共用相同的內容。

另外一個關係值得注意的是Page table與Page restrictions table為一對多的關係,在Page restrictions當中記錄頁面的存取資訊,例如頁面是否被保護。

表格名稱 表格說明
Page table 描述頁面名稱相關資訊。
Revision table 描述頁面各個版本資訊,一個頁面可以有多個版本。
Text table 用來實際儲存頁面內容,一筆Text table可對應到多個版本。
Page restrictions table 記錄頁面權限資訊,例如誰可以移動及刪除。
Archive table 記錄刪除的頁面資訊。
Image table 記錄上傳檔案資訊。
Oldimage table 記錄舊版的上傳檔案資訊,其中舊版檔案放置於/image/archive目錄。
Filearchive table 記錄刪除的檔案資訊,必須要將$wgFileStore參數啟動才會記錄。
Math table 記錄數學公式相關資訊,主要為原始的數學公式語法及解析後的數學公式語法。

Page table

名稱 型態 用途
page_id int(8) 頁面的Primary Key
page_namespace int(11) 頁面所屬的Namespace
page_title varchar(255) 頁面名稱
page_restrictions tinyblob 用逗號分隔的Permission Key誰可移動或保護頁面,在1.10版已移至page restrictions table
page_counter bigint(20) 頁面被瀏覽的次數。
page_is_redirect tinyint(1) 是否為redirect頁面,其值為0或1,1為redirect頁面。
page_is_new tinyint(1) 是否為新頁面,其值為0或1,1為新頁面。
page_random double 頁面的隨機值介於0到1之間,用在隨機頁面的功能。
page_touched char(14) 頁面最後被重新Render的時間。
page_latest int(8) 頁面最新的版本編號,儲存值為mw_revision裡的rev_id。
page_len int(8) 根據頁面的原始Wiki語法統計的Bytes數。

Revision table

在每次使用者編輯時就會新增一筆記錄,用來記錄使用者的修改記錄。

名稱 型態 用途
rev_id int(8) 每個版本的Primry Key。
rev_page int(8) 版本對應到的頁面編號。
rev_text_id int(8) 儲存text table的old_id,text table為實際儲存資料的表格;可能多個版本共用一個text table record;例如版本只有改變metadata,或是版本rollback的情況。
rev_comment tinyblob 使用者編輯的註解(edit summary)。
rev_user int(5) 編輯者的編號,若為0則是匿名使用者或是匯入。
rev_user_text varchar(255) 編輯者名稱或是匿名使用者的IP。
rev_timestamp char(14) 版本修改日期。
rev_minor_edit tinyint(1) 是否為小修改,若為1為小修改,0為正常修改。
rev_deleted tinyint(1) 版本是否被刪除,尚未使用。
rev_len int(8) 版本長度,1.10版後加入。
rev_parent_id int(8) This field is used to add support for a tree structure (The Adjacency List Model). 1.10版後加。

Text table

每個版本會對應到一個Text table記錄。

名稱 型態 用途
old_id int(8) 頁面的Primary Key
old_text mediumblob 實際的頁面內容
old_flags tinyblob 內容的flag列表,包含gzip代表壓縮內容、utf8代表內容為UTF編碼、object代表內容有PHP物件。

Page restrictions table

用來描述頁面權限。

名稱 型態 用途
pr_id int(10) unsigned 表格的PrimaryID。
pr_page int(8) 頁面編號page_id。
pr_type varchar(255) 權限種類如編輯或是移動。
pr_level varchar(255) 權限等級如完全保護(只有管理者)或是半保護(註冊者或是已確認註冊者)。
pr_cascade tinyint(4) 循環保護,是否要連頁面相關的Template及影像都一起保護。
pr_user int(8) 使用者編號,目前暫無用途,未來可用於個別使用者權限管理。
pr_expiry char(14) 權限過期日,若為空值則為永久有效。

Comments