接下来正式开篇讲解在实际中大型项目中oracle的高级设计及开发的内容,以下讲解的oracle内容以及示例程序都是基于oracle11R2。
为了防止脱离实际地搞一堆理论,本人尽量用实际工作中的例子来说明问题,当然一些必要的理论有时候还是需要讲解,因为说的内容是高级设计及开发,入门级的SQL以及数据库概念将不会做详细讲解。
绝大多数IT项目,都是围绕数据库进行各种业务的,所以也有人将这类项目称为数据库项目,也就是说数据库是重点,有过项目设计经验的都知道,好的数据库设计,可以让开发和维护变得简单,提升系统的扩展性。要想设计一个好的数据库系统,对数据库知识的掌握程度,加上个人的业务经验,直接决定了设计的好坏。
Oracle数据库是个庞大的体系,从大的方向可以分为oracle内部体系结构和外部体系结构。本人以后将陆陆续续通过实际例子引出oracle的体系结构的各种知识。
言归正传,我们现在要开发一个百万级别访问量的商业问卷调查系统,参与调查的网民将参与抽奖活动,我们开始进行数据库设计。
因为是oracle高级设计和开发的讲解,具体的业务分析不深入,简单说明:从使用者角度,系统会分两部分,一个是网站前端,一个是管理后台;从业务上分类,则会包含会员管理模块、问卷内容管理模块、统计分析模块、积分模块、权限设置、系统设置等等。
接下来将截取会员管理模块部分,详细讲解数据库高级设计,引出各种oracle的各种知识,特别是可以优化设计和开发的知识,其中一些业务细节将被忽略。不当之处请见谅,谢谢高手们批评指正。
首先要判断系统的类型,毫无疑问,问卷调查系统是个OLTP系统。
其次评估数据量,评估下来会有2000万用户,活跃用户会有200万。2000万用户当然不算小,1个字节位就是20M的数据,假如一条会员记录信息有0.5K的话,会员表的大小就是10G。
由上面两个评估和判断可以得出结论,普通的企业管理软件的设计思路肯定不是好方法。
通常的会员系统中会员表会包括以下字段:
会员ID、会员登录名、会员登录密码、会员昵称、会员email、会员中文名、证件类型、证件号码、会员手机、会员性别、会员类别、会员QQ号码、联系电话、联系地址、邮政编码、会员所在地区、会员生日、兴趣爱好、职业、岗位、
自我介绍、个人头像、注册时间,等等
在设计上性能就很重要,可以起码从以下五点考虑:
A) 合理定义字段的数据类型
B) 将会员表分拆成多个表
C) 建立分区表
D) 建立适当的索引
E) 普通表数据对应的表空间和索引表对应的数据表空间分离
下面针对这五点考虑分别展开论述。
l 合理字段的数据类型
合理的字段类型定义,会让数据结构变得清晰,同时也会影响系统的性能,道理很简单,本来可以2个字节存储的,被定义为10个字节,让存储空间变大,增大系统读写数据的I/O开销。
ORACLE数据库端的数据类型实际包括两种:表字段数据类型和PL/SQL语言的数据类型。由于这两种重合度很高,导致很多人以为就是同一个东西。
Oracle表对象的数据类型分类整理如下:
A) 常用基本数据类型
CHAR 固定长度字符串 最大长度2000bytes
VARCHAR2 可变长度的字符串 最大长度4000 bytes 可做索引的最大长度749
NCHAR 根据字符集而定的固定长度字符串 最大长度2000 bytes UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节
NVARCHAR2 根据字符集而定的可变长度字符串 最大长度4000 bytes
DATE 日期类型(日月年 时分秒)
TIMESTAMP(p) 日期类型,它与date的区别是不仅可以保存日期和时间,还能保存小数秒,小数位数可以指定为0-9,默认为6位
NUMBER(P,S) 数字类型 P为整数位+小数位,S为小数位,通常最大值为number(38,16)
CLOB 字符数据 最大长度4G 说明:通常存储内容长度超过2000的内容
B) 非常用基本数据类型
BLOB 二进制数据 最大长度4G
LONG 超长字符串 最大长度2G(231-1) 足够存储大部头著作 --说明:建议不要使用,采用clob代替
RAW 固定长度的二进制数据 最大长度2000bytes 可存放多媒体图象声音等
LONG RAW 可变长度的二进制数据 最大长度2G 同上
NCLOB 根据字符集而定的字符数据 最大长度4G
BFILE 存放在数据库外的二进制数据
C) 扩展的数据类型
DECIMAL(P,S)(常用) 数字类型 P为整数位,S为小数位
INTEGER(常用) 整数类型 小的整数
FLOAT 浮点数类型 NUMBER(38),双精度
REAL 实数类型 NUMBER(63),精度更高
设计数据库表,依据具体的业务,在定义数据类型时要注意的重点知识:
1) 尽量给每个表一个number类型的唯一数值主键ID,每个ID对应一个序列(sequence)。强调一下,用序列方式来生成表的主键ID,是oracle支持高并发的因素之一,oracle可以一次产生多个ID存放在内存中供分配,而不需要每次都是实时产生一个新的ID。
2) char、varchar2、nchar和nvarchar2数据类型的区别(前面有说明,不重复);
3) number数据类型尽量明确定义精度,若不定义精度时,通常缺省为number(38),占20个字节;
4) 存放数值类型的字段强烈建议设置为 NOT NULL,同时指定缺省值,理由是当数值型字段参与数学函数计算时,若有字段值为null,整个计算结果将得到null;
5) date类型与timestamp类型区别;
6) 每种数据类型所占字节数,通过dump函数计算;
7) Long类型,尽量使用clob代替long类型。
说明:long类型的缺点、date和timestamp的区别、如何使用dump函数计算数据类型存储空间等具体的技术细节将不展开,有兴趣的朋友可以自行通过网络查找,本文是讲解思路以及方法,希望给渔,而不是鱼,内容是针对有一定基础的读者。
会员表字段(部分)类型定义样例如下:
会员 ID | Number(10) |
会员登录名 | varchar2(20) |
会员PWD | char(32),说明:32位MD5密文 |
会员昵称 | nvarchar2(20) |
会员email | varchar2(50) |
注册时间 | Date |
未完,待续。。。