您的位置:首页 > 数据库 > Oracle

连载:告诉你如何设计一个日访问量千万级别的系统,谈oracle的高级设计和开发(2)

2015-03-05 17:17 337 查看
接下来正式开篇讲解在实际中大型项目中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),说明:
4000
32位MD5密文

会员昵称

nvarchar2(20)

会员email

varchar2(50)

注册时间

Date

 

未完,待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐