本文档描述Moodle(魔灯)数据库结构开发规范。
为了帮助您创建符合这些规范的数据表,建议您使用内置的数据库定义(XMLDB)编辑器。
1 每个表都必须有一个自动递增的id字段(INT10)作为主键。
2 包含每个模块【module】实例【instances】的主表必须与模块(例如小部件【widget】)具有相同的名称,并且至少包含以下字段:
id -如上所述
course -模块实例所属课程的id
name -模块实例的全名
3与包含“things”信息的模块相关联的其他表应命名为widget_things(注意复数形式)。
4一般来说,核心表的表名应该使用一个非复数单词,而两个单词的表名只能是最后一个单词采用复数,例如course、course_categories。只有保留字【reserved words】例外,例如files。(由于历史原因,目前有些表名不遵守这种规范,但这种情况后续会改变)
5 表名和列名应避免在任何数据库中使用的保留字【reserved words】。请在创建之前检查它们。表名最多可包含28个字符,列名最多可包含30个字符。
6 列名应该始终是小写、简单和简短的,遵循与变量名相同的规则。
7 在可能的情况下,包含对另一个表(例如小部件【widget】)的id字段的引用的列应该称为widgetid。(请注意,此约定是新的,在一些旧表中没有遵循)
8布尔字段应实现为包含0或1的小整数字段(例如INT4),以便以后在必要时扩展值。
9大多数表都应该有一个timemodified字段(INT10),该字段用PHP的time() 函数获得的当前时间戳更新字段值。
10始终为每个字段定义一个默认值(并使其合理)
11每个表名都应该以数据库前缀($CFG->prefix)开头。在很多情况下,这会自动为您解决。此外,在Postgres下,每个索引的名称也必须以前缀开头。
12为了保证跨数据库的兼容性,请遵循以下关于AS关键字使用的简单规则(当然,只有在需要在sql语句中为表、字段指定别名的时候):
- 不要对表的别名使用AS关键字。
- 不要在删除语句中对表使用别名(Mysql不喜欢)。
- 对字段别名使用AS关键字。
13绝对不要创建唯一键【UNIQUE KEYs】约束。而是使用唯一索引【UNIQUE INDEXes.】。将来,如果官方决定向Moodle添加引用完整性,需要的话会使用唯一键【UNIQUE KEYs】,但现在不会。请注意,XMLDB编辑器允许您同时指定XMLDB-only UNIQUE和FOREIGN约束(有利于更好地定义XML),但只会在底层生成索引。
14仅当字段将成为某些(XMLDB-only)外键的引用目标的时候,才为这些字段定义XMLDB-only UNIQUE KEYs,否则,定义为简单的唯一索引【UNIQUE INDEXes】。
15与版块【block】相关联的表的名称必须遵循如下约定:$CFG->prefix + “block_” + name_of_the_block + 其他内容。例如,假设$CFG->prefix是’mdl_’,块“rss_client”的所有表都必须以’mdl_block_rss_client’开头(可以在末尾添加更多单词,例如’mdl_block_rss_client_anothertable’ 等等)。
16不要在稳定的分支中更改数据库。如果这样做,那么当用户从一个稳定版本升级到下一个稳定版本时,将发生重复更改数据库,这可能会导致严重错误。
17在SQL查询中引用整型变量时,不要将值括在引号中。例如,下面的语句是正确的
get_records_select( 'question', 'category=$catid' )
下面的语句是错误的:
get_records_select('question', “category='$catid’” )
它隐藏未定义$catid的bug。(如果加了引号,当$catid没有值时,sql语句也不会报错)
18在SQL查询语句中,不要对变量的值使用双引号(例如SELECT*FROM{user}WHERE username=“someuser” )。虽然在MySQL中,这样的SQL语句没有问题,但这不符合ANSI数据库标准,比如Postgresql就会将双引号的变量值视为系统标识符(例如字段名)。
19 Moodle不支持数据库“视图”【view】,不要使用视图。如果数据库存在视图、不符合规范的表,在数据库转换、迁移、备份、恢复、升级等操作中,可能会出现错误。