MOODL的數(shù)據(jù)庫結(jié)構(gòu)開發(fā)規(guī)范

本文檔描述Moodle(魔燈)數(shù)據(jù)庫結(jié)構(gòu)開發(fā)規(guī)范。

為了幫助您創(chuàng)建符合這些規(guī)范的數(shù)據(jù)表,建議您使用內(nèi)置的數(shù)據(jù)庫定義(XMLDB)編輯器。

1 每個(gè)表都必須有一個(gè)自動(dòng)遞增的id字段(INT10)作為主鍵。

2 包含每個(gè)模塊【module】實(shí)例【instances】的主表必須與模塊(例如小部件【widget】)具有相同的名稱,并且至少包含以下字段:

id -如上所述

course -模塊實(shí)例所屬課程的id

name -模塊實(shí)例的全名

3與包含“things”信息的模塊相關(guān)聯(lián)的其他表應(yīng)命名為widget_things(注意復(fù)數(shù)形式)。

4一般來說,核心表的表名應(yīng)該使用一個(gè)非復(fù)數(shù)單詞,而兩個(gè)單詞的表名只能是最后一個(gè)單詞采用復(fù)數(shù),例如course、course_categories。只有保留字【reserved words】例外,例如files。(由于歷史原因,目前有些表名不遵守這種規(guī)范,但這種情況后續(xù)會(huì)改變)

5 表名和列名應(yīng)避免在任何數(shù)據(jù)庫中使用的保留字【reserved words】。請(qǐng)?jiān)趧?chuàng)建之前檢查它們。表名最多可包含28個(gè)字符,列名最多可包含30個(gè)字符。

6 列名應(yīng)該始終是小寫、簡(jiǎn)單和簡(jiǎn)短的,遵循與變量名相同的規(guī)則。

7 在可能的情況下,包含對(duì)另一個(gè)表(例如小部件【widget】)的id字段的引用的列應(yīng)該稱為widgetid。(請(qǐng)注意,此約定是新的,在一些舊表中沒有遵循)

8布爾字段應(yīng)實(shí)現(xiàn)為包含0或1的小整數(shù)字段(例如INT4),以便以后在必要時(shí)擴(kuò)展值。

9大多數(shù)表都應(yīng)該有一個(gè)timemodified字段(INT10),該字段用PHP的time() 函數(shù)獲得的當(dāng)前時(shí)間戳更新字段值。

10始終為每個(gè)字段定義一個(gè)默認(rèn)值(并使其合理)

11每個(gè)表名都應(yīng)該以數(shù)據(jù)庫前綴($CFG->prefix)開頭。在很多情況下,這會(huì)自動(dòng)為您解決。此外,在Postgres下,每個(gè)索引的名稱也必須以前綴開頭。

12為了保證跨數(shù)據(jù)庫的兼容性,請(qǐng)遵循以下關(guān)于AS關(guān)鍵字使用的簡(jiǎn)單規(guī)則(當(dāng)然,只有在需要在sql語句中為表、字段指定別名的時(shí)候):

  • 不要對(duì)表的別名使用AS關(guān)鍵字。
  • 不要在刪除語句中對(duì)表使用別名(Mysql不喜歡)。
  • 對(duì)字段別名使用AS關(guān)鍵字。

13絕對(duì)不要?jiǎng)?chuàng)建唯一鍵【UNIQUE KEYs】約束。而是使用唯一索引【UNIQUE INDEXes.】。將來,如果官方?jīng)Q定向Moodle添加引用完整性,需要的話會(huì)使用唯一鍵【UNIQUE KEYs】,但現(xiàn)在不會(huì)。請(qǐng)注意,XMLDB編輯器允許您同時(shí)指定XMLDB-only UNIQUE和FOREIGN約束(有利于更好地定義XML),但只會(huì)在底層生成索引。

14僅當(dāng)字段將成為某些(XMLDB-only)外鍵的引用目標(biāo)的時(shí)候,才為這些字段定義XMLDB-only UNIQUE KEYs,否則,定義為簡(jiǎn)單的唯一索引【UNIQUE INDEXes】。

15與版塊【block】相關(guān)聯(lián)的表的名稱必須遵循如下約定:$CFG->prefix + “block_” + name_of_the_block + 其他內(nèi)容。例如,假設(shè)$CFG->prefix是’mdl_’,塊“rss_client”的所有表都必須以’mdl_block_rss_client’開頭(可以在末尾添加更多單詞,例如’mdl_block_rss_client_anothertable’ 等等)。

16不要在穩(wěn)定的分支中更改數(shù)據(jù)庫。如果這樣做,那么當(dāng)用戶從一個(gè)穩(wěn)定版本升級(jí)到下一個(gè)穩(wěn)定版本時(shí),將發(fā)生重復(fù)更改數(shù)據(jù)庫,這可能會(huì)導(dǎo)致嚴(yán)重錯(cuò)誤。

17在SQL查詢中引用整型變量時(shí),不要將值括在引號(hào)中。例如,下面的語句是正確的

get_records_select( 'question', 'category=$catid' )

下面的語句是錯(cuò)誤的:

get_records_select('question', “category='$catid’” )

它隱藏未定義$catid的bug。(如果加了引號(hào),當(dāng)$catid沒有值時(shí),sql語句也不會(huì)報(bào)錯(cuò))

18在SQL查詢語句中,不要對(duì)變量的值使用雙引號(hào)(例如SELECT*FROM{user}WHERE username=“someuser” )。雖然在MySQL中,這樣的SQL語句沒有問題,但這不符合ANSI數(shù)據(jù)庫標(biāo)準(zhǔn),比如Postgresql就會(huì)將雙引號(hào)的變量值視為系統(tǒng)標(biāo)識(shí)符(例如字段名)。

19 Moodle不支持?jǐn)?shù)據(jù)庫“視圖”【view】,不要使用視圖。如果數(shù)據(jù)庫存在視圖、不符合規(guī)范的表,在數(shù)據(jù)庫轉(zhuǎn)換、遷移、備份、恢復(fù)、升級(jí)等操作中,可能會(huì)出現(xiàn)錯(cuò)誤。

發(fā)表評(píng)論

您的電子郵箱地址不會(huì)被公開。 必填項(xiàng)已用*標(biāo)注