动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息



本月文章推荐
.Oracle任命第十二个董事 Seligma.
.Actualtests Oracle 1Z0-007 V04.
.Oracle 9i锁.
.Oracle数据库诊断性能问题.
.sql load的一点小总结.
.用Oracle的解析函数发现序列间隙.
.Oracle 10G Beta版在Win2000上安.
.解决Restarting死进程QMN0问题一.
.Oracle数据库中通过ADO数据存取分.
.ERP performance tuning 第二天.
.Oracle中十进制与十六进制转换程.
.[基础]9i新特性之五闪回查询.
.实现高可用性设计的奥秘.
.Oracle 9i在Red Hat7.1和7.2上的.
.ExactPapers Oracle 1Z0-030 200.
.创建 ext3 文件系统的步骤(摘)-.
.支持Web的OLAP.
.教你清除Oracle中无用的索引改善.
.教你如何收集Oracle进程中的SQL跟.
.Oracle的入门心得(1).

新手浅谈数据库中的设计技巧(一)

发表日期:2008-2-9 |



  说到数据库,我认为不能不先谈数据结构。1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法。尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主,但我还是深深赞同8年前老师的告诉我们的公式:计算机程序=数据结构+算法。 面向对象的程序开发,要做的第一件事就是,先分析整个程序中需处理的数据,从中提取出抽象模板,以这个抽象模板设计类,再在其中逐步添加处理其数据的函数(即算法),最后,再给类中的数据成员和函数划分访问权限,从而实现封装。
  
  数据库的最初雏形据说源自美国一个奶牛场的记账薄(纸质的,由此可见,数据库并不一定是存储在电脑里的数据^_^),里面记录的是该奶牛场的收支账目,程序员在将其整理、录入到电脑中时从中受到启发。当按照规定好的数据结构所采集到的数据量大到一定程度后,出于程序执行效率的考虑,程序员将其中的检索、更新维护等功能分离出来,做成单独调用的模块,这个模块后来就慢慢发展、演变成现在我们所接触到的数据库治理系统(dbms)——程序开发中的一个重要分支。
  
  下面进入正题,首先按我个人所接触过的程序给数据库设计人员的功底分一下类:
  
  1、没有系统学习过数据结构的程序员。这类程序员的作品往往只是他们的即兴玩具,他们往往习惯只设计有限的几个表,实现某类功能的数据全部塞在一个表中,各表之间几乎毫无关联。网上不少的免费治理软件都是这样的东西,当程序功能有限,数据量不多的时候,其程序运行起来没有什么问题,但是假如用其治理比较重要的数据,风险性非常大。
  
  2、系统学习过数据结构,但是还没有开发过对程序效率要求比较高的治理软件的程序员。这类人多半刚从学校毕业不久,他们在设计数据库表结构时,严格按照教科书上的规定,死扣e-r图和3nf(别灰心,所有的数据库设计高手都是从这一步开始的)。他们的作品,对于一般的Access型轻量级的治理软件,已经够用。但是一旦该系统需要添加新功能,原有的数据库表差不多得进行大换血。
  
  3、第二类程序员,在经历过数次程序效率的提升,以及功能升级的折腾后,终于升级成为数据库设计的老鸟,第一类程序员眼中的高人。这类程序员可以胜任二十个表以上的中型商业数据治理系统的开发工作。他们知道该在什么样的情况下保留一定的冗余数据来提高程序效率,而且其设计的数据库可拓展性较好,当用户需要添加新功能时,原有数据库表只需做少量修改即可。
  
  4、在经历过上十个类似数据库治理软件的重复设计后,第三类程序员中坚持下来没有转行,而是希望从中找出“偷懒”窍门的有心人会慢慢觉悟,从而完成量变到质变的转换。他们所设计的数据库表结构有一定的远见,能够猜测到未来功能升级所需要的数据,从而预先留下伏笔。这类程序员目前大多晋级成数据挖掘方面的高级软件开发人员。
  
  5、第三类程序员或第四类程序员,在对现有的各家数据库治理系统的原理和开发都有一定的钻研后,要么在其基础上进行二次开发,要么自行开发一套有自主版权的通用数据库治理系统。
  
  我个人正处于第三类的末期,所以下面所列出的一些设计技巧只适合第二类和部分第三类数据库设计人员。同时,由于我很少碰到有爱好在这方面深钻下去的同行,所以文中难免出现错误和遗漏,在此先行声明,欢迎大家指正,不要藏私哦8)
  
  一、树型关系的数据表
  
  不少程序员在进行数据库设计的时候都碰到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某些子类又有子类这样的情况。当类别不确定,用户希望可以在任意类别下添加新的子类,或者删除某个类别和其下的所有子类,而且预计以后其数量会逐步增长,此时我们就会考虑用一个数据表来保存这些数据。按照教科书上的教导,第二类程序员大概会设计出类似这样的数据表结构:
  
  类别表_1(type_table_1)
  
  名称          类型约束条件  说明
  
  type_id    int     无重复     类别标识,主键
  
  type_name char(50)   不答应为空   类型名称,不答应重复
  
  type_father  int    不答应为空   该类别的父类别标识,假如是顶节点的话设定为某个唯一值
  
  这样的设计短小精悍,完全满足3nf,而且可以满足用户的所有要求。是不是这样就行呢?答案是no!why?
  
  我们来估计一下用户希望如何罗列出这个表的数据的。对用户而言,他当然期望按他所设定的层次关系一次罗列出所有的类别,例如这样:
  
  总类别
  
  类别1
  
  类别1.1
  
  类别1.1.1
  
  类别1.2
  
  类别2
  
  类别2.1
  
  类别3
  
  类别3.1
  
  类别3.2
  
  ……
  
  看看为了实现这样的列表显示(树的先序遍历),要对上面的表进行多少次检索?注重,尽管类别1.1.1可能是在类别3.2之后添加的记录,答案仍然是n 次。
这样的效率对于少量的数据没什么影响,但是日后类型扩充到数十条甚至上百条记录后,单单列一次类型就要检索数十次该表,整个程序的运行效率就不敢恭维了。或许第二类程序员会说,那我再建一个临时数组或临时表,专门保存类型表的先序遍历结果,这样只在第一次运行时检索数十次,再次罗列所有的类型关系时就直接读那个临时数组或临时表就行了。其实,用不着再去分配一块新的内存来保存这些数据,只要对数据表进行一定的扩充,再对添加类型的数量进行一下约束就行了,要完成上面的列表只需一次检索就行了。下面是扩充后的数据表结构:
  
  类别表_2(type_table_2)
  
  名称          类型约束条件         说明
  
  type_id    int    无重复           类别标识,主键
  
  type_name char(50)   不答应为空         类型名称,不答应重复
  
  type_father  int    不答应为空         该类别的父类别标识,假如是顶节点的话设定为某个唯一值
  
  type_layer  char(6)  限定3层,初始值为000000   类别的先序遍历,主要为减少检索数据库的次数
  
  按照这样的表结构,我们来看看上面例子记录在表中的数据是怎样的:
  
  type_id   type_name    type_father    type_layer
  
  1      总类别      0        000000
  
  2      类别1       1        010000
  
  3      类别1.1      2        010100
  
  4      类别1.2      2        010200
  
  5      类别2       1        020000
  
  6      类别2.1      5        020100
  
  7      类别3       1        030000
  
  8      类别3.1      7        030100
  
  9      类别3.2      7        030200
  
  10      类别1.1.1     3        010101
  
  ……
  
  现在按type_layer的大小来检索一下:select * from type_table_2 order by type_layer
  
  列出记录集如下:
  
  type_id   type_name    type_father    type_layer
  
  1      总类别        0      000000
  
  2      类别1        1      010000
  
  3      类别1.1       2      010100
  
  10      类别1.1.1      3      010101
  
  4      类别1.2       2      010200
  
  5      类别2        1      020000
  
  6      类别2.1       5      020100
  
  7      类别3        1      030000
  
  8      类别3.1       7      030100
  
  9      类别3.2       7      030200
  
  ……
  
  现在列出的记录顺序正好是先序遍历的结果。在控制显示类别的层次时,只要对type_layer字段中的数值进行判定,每2位一组,如大于0则向右移2 个空格。当然,我这个例子中设定的限制条件是最多3层,每层最多可设99个子类别,只要按用户的需求情况修改一下type_layer的长度和位数,即可更改限制层数和子类别数。其实,上面的设计不单单只在类别表中用到,网上某些可按树型列表显示的论坛程序大多采用类似的设计。
  
  或许有人认为,type_table_2中的type_father字段是冗余数据,可以除去。假如这样,在插入、删除某个类别的时候,就得对 type_layer 的内容进行比较繁琐的判定,所以我并没有消去type_father字段,这也正符合数据库设计中适当保留冗余数据的来降低程序复杂度的原则,后面我会举一个故意增加数据冗余的案例。
  
  二、商品信息表的设计
  
  假设你是一家百货公司电脑部的开发人员,某天老板要求你为公司开发一套网上电子商务平台,该百货公司有数千种商品出售,不过目前仅打算先在网上销售数十种方便运输的商品,当然,以后可能会陆续在该电子商务平台上增加新的商品出售。现在开始进行该平台数据库的商品信息表的设计。每种出售的商品都
上一篇:Oracle备份与恢复案例二 人气:416
下一篇:Oracle备份与恢复案例一 人气:420
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-25 WikyBlog v1.7.0.1 多国语言版
2008-7-25 乐彼网上开店系统(56770 Eshop)
2008-7-25 赛特网站管理系统sitecms v3.6.0
2008-7-25 Modoer多功能点评系统 v1.0.1 Bu
2008-7-25 Shangducms Teamsuit! v1.1.0 开
2008-7-25 幻影动漫网视频系统(Ppdong) v1.
2008-7-25 acteecompany企业网站建设系统 v
2008-7-25 恒浪整合管理系统 ims v4.1 ACCE
2008-7-25 艺术图库系统 v1.0 beta
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵