Oracle数据库设计要做到五戒
众所周知,数据库设计的好坏直接关系到数据库运行的效率。根据笔者的经验,对于提升数据库性能来说,合理的数据库设计,比升级服务器的硬件配置,还要来的有效。但是,笔者无论是在跟同事合作,又或者是在论坛上跟相关同行交流的时候,总是会发现有些人有一些不好的数据库设计习惯,影响了数据库的性能,增加了数据库管理员的工作量。
笔者认为,为了提升数据库的性能,在Oracle数据库设计的时候,要做到五戒。
一戒:在小型表上不要建立索引。
毋庸置疑,索引可以提高数据库查询的效率。但是,俗话说,过之则不及。索引也必须用在合时的地方。如果索引设置不当,不但不会提升数据库的性能,反而会起到相反的作用。如在小型数据库上设置索引,而且这些表用户更改的比较频繁。如员工基本信息表,就是简单的不超过十个字段。这个表用户需要经常的进行插入与删除操作。当进行这些变更作业的时候,需要对索引进行维护。而这个维护的工作量可能比扫描表空间消耗更多的存储空间。从而不但起步到改善数据库性能的作用,反而是在拖后腿。
所以,在数据库设计的时候,要做到的第一个戒条就是,不要再用户经常更改的小型表上建立索引。否则的话,是得不偿失的。
二戒:不要用用户的键。
如我们在设计一个ERP系统数据库的时候,有一张销售订单表。在这张表中,有一个销售订单号。那么我们能否利用这个单号作为关联其他表的外键呢?如在销售出货单上,需要关联到销售订单。这个时候,我们能否把销售订单单号作为跟出货单关联的关键字呢?
答案是可以的,但是不是最优选择。我们可以看一下ERP的后台数据库。在销售订单表上,除了销售订单号这个唯一表示销售订单纪录的字段外,还有一个字段就是销售订单ID。在前台的出货单界面上虽然显示的是销售订单号码,但是,在后台却存储着的是销售订单ID。也就是说,数据库不是以用户的键作为主键,而是采用了数据库自动维护的单据ID这个字段。
为什么要这么设计呢?这就是笔者今天要谈的第二个戒条,不要用用户的键。通常情况下,不要选择用户可编辑的字段作为外键或者主键。因为这会增加我们额外的工作量。
如果我们把销售订单号作为外键的话,则在创建销售订单纪录后还要对用户编辑字段的行为施加限制,如判断是否违反外键的强制性规则等等。有些系统把销售订单号设置为外键的话,则往往是把这个字段设置为系统自动编号,并且用户不可更改。可是,在实际工作中,企业员工往往需要编辑这个字段。员工需要编辑这些不可编辑的字段时系统缺乏灵活性的缺陷就体现出来了。而且,当用户输入完数据保存的时候再提示纪录不符合要求,则也不是很人性化的设计。
另外,我们还必须为此设计一些检测和纠正键冲突的方法。如考虑这个外键的直是否在其他数据表中存在等等。虽然这通常只需要我们花点时间就可以搞定。但是从数据库性能上来说,这个代价就比较大了。再则,如此的话,就不能够很好的把系统的基本数据跟企业员工的数据实现很好的隔离。
所以,笔者认为,不要用用户的键来作为我们数据库设计的主键或则外键。或者说,数据库设计时用到的键要让数据库系统进行自动维护,用户不得更改这个维护规则。
三戒:不要用商务规则来实现数据的完整性。
数据的完整性有好几种实现方法。如可以通过数据库约束实现数据完整性;也可以通过前台系统的商务规则来实现数据的完整性。不过,笔者这里要建议的是,在一些大型的数据库中,不要试图通过商务规则来实现数据的完整性,而尽可能的通过数据库的约束来实现。因为若通过商务规则来实现完整性,往往会出现一些莫名其妙的错误。
如笔者就遇到过这一个案例。在数据库设计的时候,把某个字符型字段长度限制为最长50位。而在前台应用程序中,却限制了60位。在员工数据数据的时候,在前台应用程序中,可以输入55个字符。但是,下次用户查询的时候,却发现后面几个字符没有了,只剩下前面那些内容。这主要是因为在数据保存的时候,超过了数据库的最长位数限制。数据库就会自动把后面几个字符去掉然后保存。如此,用户在前台输入数据的时候,以为可以保存。但是,实际上数据库中存储的数据是不全的。
所以,笔者的第三个戒条就是,不要利用商务规则在前台实现数据的完整性。只要有可能,就要尽量在数据库系统层面实现数据的完整性。在数据库层面实现数据完整性的同时,需要注意用户的友好性。
一是要把违反约束信息尽可能详细的回馈给用户。如销售订单号,在数据库系统中设置了唯一性约束。则当用户在建立销售订单的时候,销售订单号重复时,就需要把这个约束的详细信息反馈给前台用户。若只显示不能够保存这个错误信息往往是不够的。这会让用户摸不着头脑。
二是在必要的时候,可以利用触发器来实现数据的完整性。虽然在功能设计上,我们不建议在Oracle数据库中采用触发器来实现。如要把某个小写金额转换为大小金额。我们是建议通过前台应用程序实现。因为应用程序的执行效率要比数据库的触发器高。但是,在数据库数据完整性上,在必要的时候,若靠数据库约束无法实现完整性,我们仍然建议采用触发器,而不是前台应用程序来实现。在任何情况下,不要依赖于应用程序来实现数据完整性。否则的话,很难保证数据库约束与商务层约束的一致性。
四戒:在可能的情况下,不要让前台应用程序直接访问数据表。
其实,在数据库基础表与前台应用程序之间,还有一个很好的“中间人”,那就是视图。试图是数据库基础表的一个抽象。他除了可以保障数据的质量外,还可以有效的访问前台应用程序对于数据的非法访问。所以,一些安全性级别比较高的数据库系统,在数据库设计的时候,往往会在数据库和前台应用程序代码之间提供“视图”这个中间人,让其作为基础表的“新闻发言人”。如此,前台应用程序在没有必要的情况下,可以不直接访问数据表,而是通过视图来对表实现间接的访问。
如在进行数据导入程序设计的时候,通过视图来实现则是一个很理想的方法。如用户现在要导入产品信息,包括产品基本信息、供应商信息、价格信息等等。这些信息在数据库中往往包含在三种表中,分别为产品基本信息表、供应商信息表、产品价格信息表。若前台应用程序直接访问基础表的话,就需要分别访问这三张基础表。这不但效率比较低,而且也不容易实现数据的完整性。此时,我们就可以利用视图,把一些必须要填入的字段组合在一张可更新视图中。如此,前台应用程序只需要访问一个数据库对象即可。
再者,在数据库报表设计上,更是要通过视图来实现。而不要通过传递一段SQL代码来查询基础表。这对于数据的安全性会带来比较大的威胁。
所以,第四个戒条就是,在可能的情况下,不要让前台应用程序直接访问数据表。
五戒:不要一直让用户输入数据。
有些字段其实不一定要让用户输入,只需要用户选择即可。如在人事管理系统中,企业员工所属的民族、职位、省份等等就没有必要让用户手工输入。而可以通过列表的形式让员工来进行选择。这种手段,是提高数据完整性的最佳方式之一。若能够给用户提供一个详细的列表供其选择,这样将减少键入代码的错误,同时提高数据库的一致性;也可以提高用户界面的友好性。
所以,在数据库设计的时候,尽量使用列表字段来供用户选择。若连省份等等字段都要用户手工输入的话,则我们在数据库完整性所花费的时间,就要很多。如在数据保存的时候,都要去判断用户输入的数据是否合乎完整性的规则。这显然工作量要比设计一个列表字段多得多。
故数据库设计的第五个戒条就是不要老是让用户手工输入数据。提供列表让用户进行选择,用户不仅可以提高效率,我们也可以省事,同时,也能够保障数据的准确率。
转载于:https://www.cnblogs.com/oldcat/archive/2011/09/17/2179918.html
Oracle数据库设计要做到五戒相关推荐
- 超大型Oracle数据库设计实例
超大型系统的特点为: 1.处理的用户数一般都超过百万,有的还超过千万,数据库的数据量一般超过1TB: 2.系统必须提供实时响应功能,系统需不停机运行,要求系统有很高的可用性及可扩展性. 这篇是笔者针对 ...
- oracle报错数据复数,Oracle数据库设计策略及规范
Oracle数据库设计策略及规范 设计策略及规范 1. 目的 定义Oracle数据库设计规范,作为数据库规划.设计.开发以及维护人员的技术参考资料.用以规范和指导相关人员的设计行为. 2. 概述 本文 ...
- Oracle数据库的乘号是什么,(Oracle数据库设计实验指导书yk.doc
(Oracle数据库设计实验指导书yk Oracle数据库设计实验指导书 <Oracle 数据库设计>课程实验 一.本实验课在培养实验能力中的地位及作用 Oracle 数据库设计是软件工程 ...
- Oracle数据库设计(开放式基金交易平台)
目录 项目实战1... 开放式基金交易平台(数据库设计) 1 1.1 需求描述... 1 1.2 问题分析... 1 1.3 相关技术与工具... 4 1.4 阶段划分 ...
- 七、Oracle 数据库设计
1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体. 在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证 ...
- oracle数据库纵表设计,oracle 数据库设计-数据库表设计
在数据库设计中,我的工作中经常会分析怎样商业逻辑中的表格如何设计.再设计表的关系之前 需要先了解关系型数据库特点 1关系型数据库,是指采用了关系模型来组织数据的数据库: 2.关系型数据库的最大特点就是 ...
- Oracle学习总结(2)——Oracle数据库设计总结(三大范式)
一.实体与表对应关系 表<=>实体,字段<=>属性. 二.表与表的关系(实体间的关系):一对一.一对多.多对多 一对一:一条记录只对应其他表中的一条记录有关系 学生基本信息表t ...
- Oracle数据库设计方法
数据库设计师建立数据库及应用系统的技术,是信息系统开发和建设中的核心技术,具体来说,数据库设计是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及应用系统,使之能够有效存储数据,满足各种用户 ...
- oracle数据库设计思维导图,Oracle
WITH子查询也称为CTE (Common Table Expression),是ANSI SQL-99标准的一部分.ORACLE从9i开始引入WITH子查询,把它被称作SUBQUERY FACTOR ...
最新文章
- mysql计算本月的天数_Mysql已知年、月,求起始日期,本月天数
- HTML中transform菜鸟,HTML canvas
- Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用
- Android之稍微靠谱点的透明Activity(不获取触摸事件)
- java泛型视频教程_Java泛型快速教程
- 实例1:python
- sqlserver启用登陆审计
- 2014 网选 5014 Number Sequence(异或)
- C/C++获取CPU相关信息(非WMI)
- 从0到1:Python爬虫知识点梳理
- python 读出指定的行_【python】有规律的文本中读取指定的行
- java imageicon 路径_java awt ImageIcon icon 相对路径设置
- 右键文件夹导致资源管理器关闭的处理办法
- JAVA集合和guava集合使用和原理解析
- 使用git上传uni-app项目到Gitee
- sympy的dsolve函数
- DirectX是什么,出现游戏打不开问题解决方案
- Excel中文本替换函数
- User-Agent(浏览器标识)应用详解
- python中reversed与reverse的区别
热门文章
- 徐州事业单位计算机软件类,徐州计算机办公应用软件
- 计算机网络划分子网_电网小课堂|通信类:子网划分技术
- html自定义列表第三层嵌套,【微信小程序】关于微信小程序多层嵌套渲染列表以及嵌套列表中数据的获取...
- .sql文件_面试题:mybatis 中的 DAO 接口和 XML 文件里的 SQL 是如何建立关系的?
- 设置linearlayout最大高度_高位消防水箱设置要求及历年真题
- 自然语言处理之循环神经网络(五)
- 十八、Apriori算法介绍
- 牛逼!Python的判断、循环和各种表达式(长文系列第②篇)
- Python 面向监狱编程,就靠它了
- git拉取tag_不给队友拖后腿!团队开发中 Git 最佳实践