SQL标准和规范1.docx
- 文档编号:23749489
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:13
- 大小:21.14KB
SQL标准和规范1.docx
《SQL标准和规范1.docx》由会员分享,可在线阅读,更多相关《SQL标准和规范1.docx(13页珍藏版)》请在冰豆网上搜索。
SQL标准和规范1
SQL标准和规范
一、名称与数据元素
1.名称
1.1标识符最大长度为18个字符
1.2名称中避免使用特殊字符
名称的第一个字符必须是字母,其后的字符可以是字母、数字、下划线
1.3避免使用引号分割标识符
1.4实施大写规则以避免大小写区分问题
除非小写看上去很奇怪,否则使用小写。
2.遵循ISO-11179标准命名规范
2.1标量数据元素应当满足条件
1)(在它出现的任何一个数据字典中)是唯一的
2)以单数形式表达
3)说明概念是什么,而不仅仅说明它不是什么
4)以描述性短语或者语句表达
5)不使用其他数据元素或者底层概念的嵌套定义表达
6)表、集合、其他集合应当以集合、类或者复数名称命名
7)过程名称中应当有一个动词
8)表的副本(别名)应当同时包括基表名称和它当时所起的作用
2.2避免使用描述性前缀:
tbl-前缀等
2.3制定标准化的后缀
常见的后缀有:
_id
标识符
_date
日期、时间维度
_num
标签号,用来命名某些事物的一串数字
_name
用字母表示的名称
_code
编码
_size
业界标准或尺度
_tot
总和
_seq
顺序、顺序编号
_tally
一组值的计数也称为绝对尺度
_type
一种内部和外部均有公共含义的编码机制
_status
一个反映状态的内部编码
_addr
一个实体的地址或者位置
_img
图像数据类型
2.5相关名(别名)基本上也要遵循与其他名称相同的命名规则。
表达式的别名应当从表达式的逻辑含义中派生处理,并且短小而简单。
2.6关系表名应当是常用描述术语
表和视图可以为关系建模,通常是一对多或者对对多,如果关系有一个在上下文中易于理解的常用名称,就可以使用。
2.8命名数据元素时遇到的问题
1)避免模糊名称
1 名称过于宽泛,如date(日期),说明不了实际是什么日期
2 名称是一串相互矛盾的限定符
2)避免名称在不同的地方改变
二、字体、标点和间距
1.1名称中只使用大小写字母、数字和下划
1.2列名、参数和变量等标量小写
1.3模式对象名首字母大写
模式对象包括表、视图和存储过程等。
1.4保留字大写
关键字有两类:
保留字和非保留字。
保留字是SQL语言的一部分,非保留字是出现在环境中的元数据名称,并且在实际SQL程序中不会导致语法错误。
保留字:
ALL,AND,BY,FROM等。
非保留字:
LENGTH,TYPE,DATA,NULLABLED等
1.5避免使用驼峰命名法
采用驼峰命名法的单词通常将眼睛引向一个一个的分块而不是真个单词如cupCode。
除非单词本来就符合驼峰命名法。
如MacDonald。
1.6单词间距
在语言标记之间放一个空格。
如foobar=21。
1.7遵循规范标点规则
尝试使用与英语中相同的标点规则。
1)在逗号后面加一个空格的原则
2)把逗号放置在每行的结尾而不是开头
3)在分号后面加一个新行或至少放一个空格,将不同的句子分隔开
4)即使允许将单词挤在一起,也要在他们之间放一个空格
举例:
SELECTflobs.a,flobs.b,flobs.c,--相关组
fleq.d,
FROMflobs,fleq;
1.8使用完全保留字
允许省略一些保留字,也允许缩写另外一些保留字。
尽量使用完全形式来编写程序。
如列别名最好加上AS等。
1.9如果在使用的SQL产品中有标准保留字,就不要使用专有保留字
如果专有语法被删除或者修改了,标准代码将使你避免失败。
1.10如果有标准语句,就不要使用专有语句
1.11疏排版面的隔空白道和垂直间距
隔空白道是文本中垂直的开放空格,这个向下的隔空白道将竖直方向的代码对齐并使程序易于阅读。
举例:
SELECT*
FROMtable1
WHERE<条件>
1.13使用行间距将语句分组
三、数据定义语言
1.1将默认值放到合适的地方
DEFAULT约束出现在数据类型后面,NOTNULL约束出现在DEFAULT值后面。
1.2默认值的类型应该与列的类型相同
1.3不要使用专有数据类型
专有数据类型不能移植到其他产品,对于同一个产品,也无法从一个版本移植到另一个版本。
1.4将PRIMARYKEY声明放在CREATETABLE语句的开头
在复合键的情况中,组合键的列可能不会很好的符合下一个规则(1.5),如果是这种情况,就要在主键的每一组成部分上都放一段注释,使他们易于查找。
1.5将列按照逻辑顺序排列并按照逻辑组聚合
1.6将参考约束和操作在数据类型下面缩进
1.7在产品代码中为约束命名
如果违反了约束,错误消息中就会显示约束名称。
这样就可以创建有意义的消息,易于定位错误。
1.8将CHECK()约束放在所检查的内容附近
将单个列的CHECK()约束放到它的列上,多个列的约束放到列附近。
1.9对数值考虑使用范围约束
数据库的整个思想是为企业中的所有数据提供一个可靠的储存库。
在这个地方必须实现业务规则。
1.10对于字符值考虑使用LIKE和SIMILARTO约束
1.11时间值是有长短的
1.12避免使用REAL和FLOAT数据类型
1.13将多列约束尽可能靠近这些列
1.14将表级别的CHECK()约束放到表声明的最后
1.15对多表约束使用CREATEASSERTION
将多表CHECK()约束放到CREATEASSERTION语句而不是表中
1.16使CHECK()约束的目的唯一
将简单的CHECK()约束放在他们自己的子句中,不要把多个测试都放到一个长约束中。
1.17每个表都必须有键才能称为表
1.18不要分割属性
1.19不要对RDBMS使用面向对象的设
四、尺度与测量
在数据库中使用尺度的一般准则
1)一般情况下,对于尺度所允许的转换限制越少,对于统计值的限制就越多。
2)在表声明中使用CHECK()子句确保只有允许的值才会出现在数据库中。
3)至少比你认为需要的最小单位多声明一个小数位。
4)尝试存储基本单位而不是导出单位。
5)单位不论在哪里显示,都使用同样的标点。
五、数据编码方案
1.1编码方案类型
1)枚举编码
2)测量编码
3)缩写编码
4)算法编码
5)层次编码
6)向量编码
7)拼接编码
1.2设计编码方案的一般准则
1)现有的编码标准
2)允许扩展
3)使用显示的丢失值避免NULL:
可以在编码方案中防止特殊值,以尽可能避免使用NULL。
4)为终端用户转换编码
1.3在数据库中保存编码
应当将所有的编码都存储在表中,作为数据库的一部分。
六、编码选择
1.1选择标准构造,不要选择专有构造
1.2使用标准OUTERJOIN语法
举例:
Table1
LEFTOUTERJOIN
Table2
Ontable1.a=table2.a
WHEREtable2.c='t';
1.2中缀INNERJOIN和CORSSJOIN语法是可选的
例外如果在FROM子句中有OUTERJOIN,则必须使用中缀的连接运算符。
1.3使用ISO时间语法
显示格式:
yyyy-mm-ddhh:
mm:
ss.sssss
1.4使用标准和可移植的函数
1.5选择紧凑格式,不要选择松散格式
1.6避免使用多余的括号
1.7使用CASE系统表达式
如果对于CASE表达式没有现实地给出ELSE子句,则数据库将插入一个隐式的ELSENULL子句。
如果要在THEN子句中返回NULL,必须使用CASE(NULLAS<数据类型>)表达式。
建议总是给出ELSE子句。
1.8避免使用冗余表达式
1.9寻找紧凑格式
1)使用BETWEEN谓词,不要使用AND联结的谓词
2)使用IN()谓词,不要使用OR联结的谓词-不能在NULL上使用AND、OR、NOT
3)使用CASE表达式,不使用复杂的嵌套谓词
1.10使用注释
SQL块上需要高级的描述性注释,几个重要的子句上还需要更详细的注释
1)存储过程
总是在存储过程的开头放置一段注释,并至少说明作者、日期和变更历史。
为这个模块的函数添加高级别的描述。
过程名称的格式将是<动词><对象>。
如果需要,每个参数也应当有注释。
2)控制语句注释
对控制语句(IF-THEN-ELSE、BEGIN-END和WHILE-DO循环)的注释与任何一个过程化语言的注释差不多。
3)对子句的注释
1.11避免优化器提示
1.12触发器的优先级不应当高于DRI操作
1.13使用SQL存储过程
存储过程的优势:
1)安全性
2)可维护性
3)网络流量小
4)一致性
5)模块化
1.14避免在数据库中使用用户定义函数和扩展
1)多语言问题
2)可移植性问题
3)优化问题
1.15避免使用过度的辅助索引
1.16避免使用关联子查询
1.17避免使用UNION
UNION通常都没有很好的优化,因为他们需要删除多余的重复行,所以在将结果展示给用户之前,UNION将强制大多数的SQL引擎进行排序,如果可能的话,使用UNIONALL作为代替
1.18测试SQL
1)测试NULL所有可能的组合
2)检查并测试所有的CHECK()约束
3)注意字符列
4)测试大小
七、如何使用视图
1.1视图的命名规范和表一样
总是指定列名,显示地指定视图列名而不使用默认值。
1.2视图提供行和列级别的安全性
使用视图的最大一个好处是扩展SQL的数据安全特性。
1.3视图确保了有效访问路径
1.4视图对用户隐藏了复杂性
1.5视图确保了正确的数据派生
视图的另外一个有效的用法是确保派生出的数据保持一致,采用的方法是基于算术公式为视图创建一个新列
举例
不合法语句:
SELECTemp_id,(salary+bonus)AStot_comp
FROMPayroll
WHEREtot_comp>12000.00;
合法语句:
CREATEORREPLACEPayrollSummary
AS
SELECTemp_id,(salary+bonus)AStot_comp
FROMPayroll;
SELECTemp_id,tot_comp
FROMPayrollSummary
WHEREtot_comp>12000.00;
1.6视图将表和/或列重新命名
1.7可更新视图
1)SELECT语句在一个表上,且仅在一个表示,但是视图可以在视图上面的几层视图上定义
2)视图必须包括基表中所有的约束类型为UNIQUE或者PRIMARYKEY的列
3)所有为在视图中显示的基表列必须有默认值
1.8每个视图都要有创建的原因
1.9避免视图的数量快速增长
1.10将视图与基表同步
基表无论何时发生变化,都需要分析所有依赖于这个基表的视图,以确保他们是否受到这些变化的影响。
1.11不要为每个基表都创建视图
1.12学习使用物化的视图
物化的视图出现在物理数据库中,可以像其他表一样使用。
八、如何编写存储过程
一个过程不要超过一页或者50行
1.1基本软件工程
1)内聚
内聚的最差形式到最好形式排列如下:
1 偶然的
2 逻辑的
3 时间的
4 过程的
5 通信的
6 信息的
7 功能的
2)耦合
耦合按照从最差到最好的形式排列如下:
1 内容
2 公共
3 控制
4 标记
5 数据
1.2使用传统的结构化编程
传统的控制结构有以下三种
1)拼接:
按顺序执行'BEGIN...END'
2)选择:
一个布尔表达式确定执行俩个语句块中的那一块'IF...THEN[ELSE...]ENDIF'
3)迭代:
如果一个布尔表达式为TRUE,则一个语句块将反复执行'WHILE...LOOP...ENDWHILE'
所有这些控制结构的重要特征是它们只有一个入口点和一个出口点。
在传统的结构化编程中,不要使用GOTO语句
1.3避免可移植性问题
1)避免创建临时表
2)避免使用游标
3)面向集合的构造优于过程化代码
1 使用CASE表达式代替IF-THEN-ELSE控制流语句
2 使用顺序表代替循环控制流
3 使用日历表执行时间计算
4 考虑使用辅助表执行计算
1.4避免使用动态SQL
SQL注入是一种安全攻击,攻击者将代码放到你的存储过程中并执行它
九、优化性能建议
1.依赖命名规范可以非常直观地说明标识符的意义,而且使用起来也非常方便。
推荐的常用规则:
1)在名称中标示变量的作用范围:
如全局变量以g_开头
2)在使用前缀或者后缀标示定义的结构类型
3)使用可读性强的命名格式
4)在使用那些表意过于精确且大于30个字母的标识名是必须注意
5)组合有关联的声明
INparameter
OUTparameter
INOUTparameter
Constant
c_
Globalpackagevariable
g_
Localvariable
l_
Cursor
Associativearraytype
Nestedtabletype
VARRAYtype
Recordtype
Objecttype
过程和功能的声明并不需要使用前缀或者后缀
2、使用不同的方法声明表意清楚的变量
3、执行显示的数据类型转换而不是依赖隐式的数据类型转换
4、谨慎的使用仅在包体部分声明的全局变量
5、NULL值并不等于其他的所有值,甚至是不能等同于另外一个NULL值,程序代码应当显示地处理NULL值
6、把异常转换为可以被程序代码用户理解的状态标志
7、不要重复编写一个SQL语句,取而代之的,在过程和函数中实现SQL
8、省略所有声明,用一个单独的记录来替换它们
9、只有需要知道‘多少行?
’时,才使用COUNT
10、只有当需要检索多行数据时,才使用游标FOR循环
11、确保所有新增加的IN参数都有默认值,或者增加一个重载函数
12、确保布尔型函数只能返回TRUE或者FALSE
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL 标准 规范