期刊/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) | 權限過期日,若為空值則為永久有效。 |
