前言
在本文中分享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_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數。
|
在每次使用者編輯時就會新增一筆記錄,用來記錄使用者的修改記錄。
名稱
| 型態
| 用途
|
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記錄。
名稱
| 型態
| 用途
|
old_id
| int(8)
| 頁面的Primary Key
|
old_text
| mediumblob
| 實際的頁面內容
|
old_flags
| tinyblob
| 內容的flag列表,包含gzip代表壓縮內容、utf8代表內容為UTF編碼、object代表內容有PHP物件。
|
用來描述頁面權限。
名稱
| 型態
| 用途
|
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)
| 權限過期日,若為空值則為永久有效。
| |