标识符(identifier):说明用户或系统为数据库对象设定的名字,如数据库、数据表、表约束及表内的字段、视图等。
请记住,RDBMS是以集合论为基础的。根据ANSI的定义,集群包含目录集,目录包含模式集,模式包含对象集等。大多数数据库平台使用推论术语:实例包含一个或多个数据库,数据库包含一个或多个模式,模式包含一个或多个数据表、视图或存储过程及与每个对象相关的权限。在此架构的每一层上,这些项目均需要唯一的名称(即标识符),以便于让程序及系统处理时可以引用该名称。这表明RDBMS上的每个对象(无论是数据库、数据表、视图、列、索引、关键字、触发器、存储过程还是约束)都必须能被识别。发出创建数据库对象的命令时,必须明确指定新对象的标识符(即名称)。
经验丰富的程序员为给定的项目选择标识符时,会谨记两个重要的准则:
l 命名惯例——逻辑概测法(logical rule of thumb)可用于管理数据库设计师如何命名新对象。最终遵循这些逻辑规则可创建更好的数据库结构并能改良数据跟踪。这些并不是SQL的要求,而是实践中程序员累积的经验。
l 标识符规则——这是由SQL标准设定并由平台实现的规则。这些规则包括如名称长度这样的特性。本章后面将说明每个数据库厂商的标识符设定惯例。
标识符的命名惯例
命名惯例为选择对象标识符建立了一个标准基线。本节将列出一些由多年经验积累而得到的命名惯例(选定标识符的规则)。SQL标准除了标识符的唯一性、长度及标识符内的有效字符外,它对命名惯例并未作任何注解。但是,下面是你应该遵循的一些惯例:
选择有意义、相关及有描述性的名称
不要把表命名为XP03,而应把它命名为Expenses_2005,以显示此表是存储2005年的费用的。记住,其他人可能也会使用此表或数据库,或许你离开很久之后才有人使用它,因此你使用的名称应一目了然。尽管每个数据库厂商对对象名称的长度有限制,但是,通常情况下名称还是可以足够长的,以便让用户都能看得懂。
自始至终选择并应用相同的案例
数据库中的所有对象要全部使用大写字母或全部使用小写字母。某些数据库服务器对大小写敏感,因此使用大小写混合的标识符(mixed-case identifier)可能会造成日后的问题。
使用一致的缩写
选择好缩写以后,整个数据库都要使用一致的缩写。例如,如果以“EMP”作为“EMPLOYEE”的缩写,那么整个数据库都应使用“EMP”。不要在某些地方使用“EMP”,而在另外一些地方使用“EMPLOYEE”。
使用完整、富有描述性、有意义的名称以方便阅读
名为UPPERCASEWITHUNDERSCORES的字段不如写成UPPERCASE_WITH_UNDERSCORES易读。
不要在数据库对象名中放入公司或产品名
因为公司有可能被收购,产品也有可能会改名。这些元素过于无常,不适宜放在数据库对象名中。
不要过度使用太明显的前缀或后缀
例如,别用DB_作为数据库名的前缀,每个视图名称的前缀不要使用“V_”。要能简单地查询数据库的系统表,数据库管理员或数据库程序员才可以知道标识符所表示的对象类型。
不要让对象名用完所有可用空间
如果数据库平台的表名长度可达32个字符,那么在字尾至少要保留几个空格。某些数据库平台在操作表的临时文件时,会在表名中加入前缀或后缀。
不要使用引用标识符
引用标识符(quoted identifier)是对象名存储在双引号内(ANSI标准称之为定界标识符—— elimited identifier)。引用标识符对大小写也是敏感的。把标识符包含在双引号内会创建出难用的、以后可能出问题的名称。例如,用户可以在引用标识符中嵌入空格、特殊字符、大小写混合字符甚至转义序列,但是由于一些第三方工具(甚至是数据库厂商提供的工具)也无法处理名称中的特殊字符。因此,不应使用引用标识符。
---------------------------------
提示:一些平台允许使用除了双引号以外的定界符。例如,SQL Server使用方括号([ ])指明引用标识符。
---------------------------------
遵循这些命名惯例的好处是:首先,SQL代码在某种意义上就像自我记录(self-documenting)一样,所选的名称是有意义的,是其他用户可以理解的。其次,由于对象命名一致,你便比较容易维护SQL代码及数据库对象(尤其是对接收你工作的其他用户而言更是如此)。最后,维护一致性可提高数据库的功能性。一旦数据库要转换或转移到另外一个RDBMS时,一致且富有描述性的命名可节省时间及精力。一开始多花些时间思考SQL对象的命名,可以预防后续的问题。
标识符设定规则
标识符设定规则是数据库平台用以识别数据库内数据对象的规则。这些规则适用于一般标识符,而不适用于引用标识符。SQL2003标准设定的规则通常与特定数据库厂商所设定的规则不同。表2-1比较了SQL2003规则与本书中收录的那些RDBMS平台的规则。
表2-1:一般对象标识符(引用标识符除外)的特定平台的规则
特性 | 平台 | 规格 |
标识符长度 | SQL3 | 128个字符 |
MySQL | 64个字符,别名可能为255个字符 | |
Oracle | 30个字符(字符数视字符集而定),数据库名最多为8个字节,数据库链接限定为128个字节 | |
PostgreSQL | 63个字符(NAMEDATALEN-1) | |
SQL Server | 128个字符,临时表最多为116个字符 | |
标识符可包含的字符 | SQL3 | 任何数字或字符及下划线(_)符号 |
MySQL | 任何数字、字符或符号,不能全部由数字组成 | |
Oracle | 任何数字或字符及下划线(_)、井号(#)及美元符号$)(然而本书并不鼓励你使用最后两个符号)。数据库链接也包含句点(.) | |
PostgreSQL | 任何数字或字符及下划线(_)符号 | |
SQL Server | 任何数字或字符及下划线(_)、at符号(@)、井号(#)及美元符号($) | |
标识符的前缀必须为 | SQL3 | 字母 |
MySQL | 字母或数字,不能全部由数字组成 | |
Oracle | 字母 | |
PostgreSQL | 字母或下划线(_) | |
SQL Server | 字母、下划线(_)、at符号(@)或井号(#) | |
标识符不能包含 | SQL3 | 空格或特殊字符 |
MySQL | 句点(.)、斜线(/)或ASCII(0)及ASCII(255)。单引号(')与双引号(" ")仅用于引用标识符内。标识符不应以空格结尾 | |
Oracle | 空格、双引号(" ")或特殊字符 | |
PostgreSQL | 双引号(" ") | |
SQL Server | 空格或特殊字符 | |
是否允许引用标识符 | SQL3 | 是 |
MySQL | 是 | |
Oracle | 是 | |
PostgreSQL | 是 | |
SQL Server | 是 | |
引用标识符符号 | SQL3 | 双引号(" ") |
MySQL | 单引号(')或ANSI兼容模式下的双引号(" ") | |
Oracle | 双引号(" ") | |
PostgreSQL | 双引号(" ") | |
SQL Server | 双引号或方括号([ ]),最好使用方括号 | |
标识符可否保留 | SQL3 | 不可以,除非是引用标识符 |
MySQL | 不可以,除非是引用标识符 | |
Oracle | 不可以,除非是引用标识符 | |
PostgreSQL | 不可以,除非是引用标识符 | |
SQL Server | 不可以,除非是引用标识符 | |
模式寻址 | SQL3 | Catalog.schema.object |
MySQL | Database.object | |
Oracle | Schema.object | |
PostgreSQL | Database.schema.object | |
SQL Server | Server.database.schema.object | |
标识符是否唯一 | SQL3 | 是 |
MySQL | 是 | |
Oracle | 是 | |
PostgreSQL | 是 | |
SQL Server | 是 | |
大小写是否敏感 | SQL3 | 否 |
MySQL | 只有底层文件系统(例如,Mac OS 或 Unix)才区分大小写。触发器、日志文件组及表空间总是区分大小写的 | |
Oracle | 默认情况下不可以,但可以修改此默认值 | |
PostgreSQL | 否 | |
SQL Server | 默认情况下不可以,但可以修改此默认值 | |
其他规则 | SQL3 | 无 |
MySQL | 不能仅包含数字 | |
Oracle | 数据库链接上限为128个字节,且不能为引用标识符 | |
PostgreSQL | 无 | |
SQL Server | Microsoft通常使用方括号而非双引号指明引用标识符 |
标识符在其作用域范围内必须是唯一的。因此,在前面讨论的数据库对象层次结构中,数据库服务器上的特定实例的数据库名必须是唯一的,给定模式内的表名、视图、函数、触发器及存储过程也必须是唯一的。另一方面,表及存储过程的名称可以相同,因为它们分属于不同的对象类型。单一表或视图上的字段、关键字及索引名必须是唯一的。有些平台必须使用唯一的标识符,而有些未规定,详细信息请参见数据库平台的说明文档。例如,Oracle 要求数据库内所有的索引标识符都必须是唯一的,而其他数据(如SQL Server)则只要求索引标识符对其相关的表有唯一性即可。
记住,引用标识符(在特殊定界符内包住的对象名通常是双引号)可用来推翻前面的某些标识符的规则。一个示例是,引用标识符是区分大小写的——即“foo”并不等于“FOO”。此外,引用标识符可让保留字成为名称或通常允许在名称内加入一般不能用的字母及符号。例如,一般表名内并不能使用百分比符号(%)。但是,只要将表名永远放在双引号中,便可以在表名内加入百分比符号(%)。即,如果把表名命名为expense%%ratios,就必须将名称放在双引号内:“expense%- %ratios”。另外,请记住,在SQL3中,这些名称有时称为定界标识符(delimited identifier)。
---------------------------------
提示:一旦设定了对象名为引用标识符,本书建议用户永远以其特殊的定界符来引用它。
---------------------------------