数据库物理设计原则
数据库环境配置原则
操作系统环境
对于中小型数据库系统采用linux操作系统比较合适对于数据库冗余要求负载均衡能力要求较高的系统可以采用Oraclei RAC的集群数据库的方法集群节点数范围在—个对于大型数据库系统可以采用Sun Solaris SPARC 位小型机系统或HP 系列小型机系统RAD 适合只读操作的数据库RAD 适合OLTP数据库
内存要求
对于linux操作系统下的数据库由于在正常情况下Oracle对SGA的管理能力不超过G所以总的物理内存在G以下SGA的大小为物理内存的%—%对于位的小型系统Oracle数据库对SGA的管理超过G的限制SGA设计在一个合适的范围内物理内存的%—%当SGA过大的时候会导致内存分页影响系统性能
交换区设计
当物理内存在G以下的情况下交换分区swap为物理内存的倍当物理内存>G的情况下swap大小为物理内存的—倍
其他环境变量参考Oracle相关的安装文档和随机文档
数据库设计原则
数据库SID
数据库SID是唯一标志数据库的符号命名长度不能超过个字符对于单节点数据库以字符开头的个长度以内字串作为SID的命名对于集群数据库当命名SID后各节点SID自动命名为SIDnn其中nn为节点号…例如racracrac
数据库全局名
数据库全局名称
<sid>domain
数据库类型选择
对于海量数据库系统采用data warehouse的类型对于小型数据库或OLTP类型的数据库采用Transaction Processing类型
数据库连接类型选择
Oracle数据库有专用服务器连接类型和多线程服务器MTS连接类型对于批处理服务需要专用服务器连接方式而对于OLTP服务则MTS的连接方式比较合适由于采用MTS后可以通过配置网络服务实现某些特定批处理服务采用专用服务器连接方式所以数据库设计时一般采用MTS类型
数据库SGA配置
数据库SGA可以采用手工配置或按物理内存比例配置在数据库初始设计阶段采用按比例配置方式在实际应用中按系统调优方式修改SGA
数据库字符集选择
为了使数据库能够正确支持多国语言必须配置合适的数据库字符集采用UTF字符集
注意如果没有大对象在使用过程中进行语言转换没有什么影响具体过程如下(切记设定的字符集必须是ORACLE支持不然不能start)
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter system enable restricted session;
SQL> alter system set job_queue_processes=;
SQL> alter database open;
SQL> alter database character set internal_use weisop;
SQL> shutdown immediate;
SQL> startup
数据库其他参数配置
DB_FILES
Db_files是数据库能够同时打开的文件数量默认值是个当数据库规划时文件数量FILES接近或超过个时候按以下估计值配置:
DB_FILES = FILES *
Db_block_size
一个extent要是个blocks的倍数为好如一个blocks是字节那一个extent就是MM或M为好Db_block_size是数据库最小物理单元一旦数据库创建完成该参数无法修改db_block_size按以下规则调整
数据仓库类型 db_block_size尽可能大采用 或
OLTP类型 db_block_size 用比较小的取值范围 或
Blocks推荐是系统操作的块倍数(裸设备块大小是字节NTFS是 K使用K的方式在大部分系统上通用)
数据库控制文件配置
控制文件镜象
多个控制文件存放在不同的物理位置
控制文件配置
控制文件中参数设置最大的数据文件数量不能小于数据库参数db_files
数据库日志文件配置
日志文件大小
日志文件的大小由数据库事务处理量决定在设计过程中确保每分钟切换一个日志文件所以对于批处理系统日志文件大小为几百M 到几G的大小对于OLTP系统日志文件大小为几百M以内
日志文件组数量
对于批处理系统日志文件组为—组对于OLTP系统日志文件组为 —组每组日志大小保持一致对于集群数据库系统每节点有各自独立的日志组
日志成员数量
为了确保日志能够镜象作用每日志组的成员为个
数据库回滚段配置
在Oraclei数据库中设计Undo表空间取代以前版本的回滚段表空间
Undo 表空间大小的设计规范由以下公式计算
Undospace = UR * UPS *db_block_size+ 冗余量
UR 表示在undo中保持的最长时间数(秒)由数据库参数UNDO_RETENTION值决定
UPS表示在undo中每秒产生的数据库块数量
例如在数据库中保留小时的回退数据假定每小时产生个数据库块则Undospace = * * * K = G
数据库临时段表空间配置
数据库临时段表空间根据实际生产环境情况调整其大小表空间属性为自动扩展
数据库系统表空间配置
系统表空间大小G左右除了存放数据库数据字典的数据外其他数据不得存储在系统表空间
数据库表空间设计原则
表空间大小定义原则
当表空间 大小小于操作系统对最大文件限制时表空间由一个文件组成如果表空间大小大于操作系统对最大文件限制时该表空间由多个数据文件组成表空间的总大小为估算为
Tablespace + sum (数据段+索引段)*%
表空间扩展性设计原则
表空间数据文件采用自动扩展的方式扩展容量快大小按的整数倍(MMMMMMM)进行扩展创建表空间时尽量采用nologing选项表空间的最大限制一般采用unlimited除非确切知道表空间数据文件的最大使用范围(一般windows 32位系统的文件最大2G64位的unix系统系统文件最大128G但也要注意文件格式设定的文件大小)建议最大为G表空间采用local管理方式例如
CREATE TABLESPACETBS_USERINFO
DATAFILE
/oradata/tbs_userinfodbf
SIZE M
REUSE
AUTOEXTEND ON
NEXT M
MAXSIZE UNLIMITED
NOLOGGING
EXTENT MANAGEMENT
LOCAL
AUTOALLOCATE
SEGMENT SPACE MANAGEMENT AUTO;
裸设备的使用
一个scsi设备可以 个分区unix操作系统个分区性能比文件系统方式高%左右空间大于要小于(实际分区大小减两个ORACLE的数据块)比如M大于为K推荐在unix使用软连接(ln)方式把裸设备形成文件用加入表空间时加resue 选项当然也可只接把设备加入表空间移动裸设备使用dd命令
对于windows平台oracle提供软连接工具实现裸设备的使用计算一条记录的长度
数据库逻辑设计原则
命名规范
表属性规范
表名
前缀为Tbl_ 数据表名称必须以有特征含义的单词或缩写组成中间可以用_分割例如tbl_pstn_detail表名称不能用双引号包含
表分区名
前缀为p 分区名必须有特定含义的单词或字串
例如 tbl_pstn_detail 的分区p表示该分区存储 时段的数据
字段名
字段名称必须用字母开头采用有特征含义的单词或缩写不能用双引号包含
主键名
前缀为PK_主键名称应是 前缀+表名+构成的字段名如果复合主键的构成字段较多则只包含第一个字段表名可以去掉前缀
外键名
前缀为FK_外键名称应是 前缀+ 外键表名 + 主键表名 + 外键表构成的字段名表名可以去掉前缀
索引
普通索引
前缀为IDX_索引名称应是 前缀+表名+构成的字段名如果复合索引的构成字段较多则只包含第一个字段并添加序号表名可以去掉前缀
主键索引
前缀为IDX_PK_索引名称应是 前缀+表名+构成的主键字段名在创建表时候用using index指定主键索引属性
唯一所以
前缀为IDX_UK_索引名称应是 前缀+表名+构成的字段名
外键索引
前缀为IDX_FK_索引名称应是 前缀+表名+构成的外键字段名
函数索引
前缀为IDX_func_索引名称应是 前缀+表名+构成的特征表达字符
蔟索引
前缀为IDX_clu_索引名称应是 前缀+表名+构成的簇字段
视图
前缀为V_按业务操作命名视图
实体化视图
前缀为MV_按业务操作命名实体化视图
存储过程
前缀为Proc_ 按业务操作命名存储过程
触发器
前缀为Trig_ 触发器名应是 前缀 + 表名 + 触发器名
函数
前缀为Func_ 按业务操作命名函数
数据包
前缀为Pkg_ 按业务操作集合命名数据包
序列
前缀为Seq_ 按业务属性命名
表空间
公用表空间
前缀为Tbs_ 根据存储的特性命名例如 tbs_parameter
专用表空间
Tbs_<表名称>_nn该表空间专门存储指定的某一个表或某一表的若干个分区的数据
数据文件
<表空间名>nndbf nn =…等
普通变量
前缀为Var_ 存放字符数字日期型变量
游标变量
前缀为Cur_ 存放游标记录集
记录型变量
前缀为Rec_ 存放记录型数据
表类型变量
前缀为Tab_ 存放表类型数据
数据库链
前缀为dbl_ 表示分布式数据库外部链接关系
命名
语言
命名应该使用英文单词避免使用拼音特别不应该使用拼音简写命名不允许使用中文或者特殊字符
英文单词使用用对象本身意义相对或相近的单词选择最简单或最通用的单词不能使用毫不相干的单词来命名
当一个单词不能表达对象含义时用词组组合如果组合太长时采用用简或缩写缩写要基本能表达原单词的意义
当出现对象名重名时是不同类型对象时加类型前缀或后缀以示区别
大小写
名称一律大写以方便不同数据库移植以及避免程序调用问题
单词分隔
命名的各单词之间可以使用下划线进行分隔
保留字
命名不允许使用SQL保留字
命名长度
表名字段名视图名长度应限制在个字符内(含前缀)
字段名称
同一个字段名在一个数据库中只能代表一个意思比如telephone在一个表中代表电话号码的意思在另外一个表中就不能代表手机号码的意思
不同的表用于相同内容的字段应该采用同样的名称字段类型定义
数据类型
字符型
固定长度的字串类型采用char长度不固定的字串类型采用varchar避免在长度不固定的情况下采用char类型如果在数据迁移等出现以上情况则必须使用trim()函数截去字串后的空格
数字型
数字型字段尽量采用number类型
日期和时间
系统时间
由数据库产生的系统时间首选数据库的日期型如DATE类型
外部时间
由数据导入或外部应用程序产生的日期时间类型采用varchar类型数据格式采用YYYYMMDDHHMISS
大字段
如无特别需要避免使用大字段(blobcloblongtextimage等)
唯一键
对于数字型唯一键值尽可能用系列sequence产生
设计
范式
如无性能上的必须原因应该使用关系数据库理论达到较高的范式避免数据冗余但是如果在数据量上与性能上无特别要求考虑到实现的方便性可以有适当的数据冗余但基本上要达到NF如非确实必要避免一个字段中存储多个标志的做法如表示个标志的一种取值这往往是增加复杂度降低性能的地方
表设计
逻辑段设计原则
Tablespace
每个表在创建时候必须指定所在的表空间不要采用默认表空间以防止表建立在系统表空间上导致性能问题对于事务比较繁忙的数据表必须存放在该表的专用表空间中
Pctused
默认pctused导致数据库物理空间利用率非常低%左右对于update比较少或update不导致行增大的表pctused可设置在—之间对于update能够导致行增大的表update设置在—之间
Initrans
对于需要并行查询或者在RAC数据库中需要并行处理的表initrans设置为的倍数否则不设该值
Storage
Initial
尽量减少表数据段的extents数量initial的大小尽量接近数据段的大小KK… MMMMM …等按的倍数进行圆整例如表或分区数据段大小为M则initial取M
Next
表或分区扩展extents的大小按上述方法进行圆整当表或分区数据段无法按Initial接近值进行圆整的情况下其大小可以按 Initial+Next进行圆整此时必须设置Minextents=例如表或分区数据段大小为M则Initial=MNext=MMinextents=
Minextents
该参数表示表创建时候Extents的初始数量一般取—
Pctincrease
表示每个扩展Extents的增长率设置pctincrease=能够获得较好的存储性能
特殊表设计原则
分区表
对于数据量比较大的表根据表数据的属性进行分区以得到较好的性能如果表按某些字段进行增长则采用按字段值范围进行范围分区如果表按某个字段的几个关键值进行分布则采用列表分区对于静态表则采用hash分区或列表分区在范围分区中如果数据按某关键字段均衡分布则采用子分区的复合分区方法
聚蔟表
如果某几个静态表关系比较密切则可以采用聚蔟表的方法
完整性设计原则
主键约束
关联表的父表要求有主健主健字段或组合字段必须满足非空属性和唯一性要求对于数据量比较大的父表要求指定索引段
外键关联
对于关联两个表的字段一般应该分别建立主键外键实际是否建立外键根据对数据完整性的要求决定为了提高性能对于数据量比较大的标要求对外健建立索引对于有要求级联删除属性的外键必须指定on delete cascade
NULL值
对于字段能否null应该在sql建表脚本中明确指明不应使用缺省由于NULL值在参加任何运算中结果均为NULL所以在应用程序中必须利用nvl()函数把可能为NULL值得字段或变量转换为非NULL的默认值例如NVL(sale)
Check条件
对于字段有检查性约束要求指定check规则
触发器
触发器是一种特殊的存储过程通过数据表的DML操作而触发执行起作用是为确保数据的完整性和一致性不被破坏而创建实现数据的完整约束
触发器的before或after事务属性的选择时候对表操作的事务属性必须与应用程序事务属性保持一致以避免死锁发生在大型导入表中尽量避免使用触发器
注释
表字段等应该有中文名称注释以及需要说明的内容
索引设计
对于查询中需要作为查询条件的字段可以考虑建立索引最终根据性能的需要决定是否建立索引对于复合索引索引字段顺序比较关键把查询频率比较高的字段排在索引组合的最前面在分区表中尽量采用local分区索引以方便分区维护
除非时分区local索引否则在创建索引段时候必须指定指定索引段的tablespacestorage属性具体参考内容