- 浏览: 93580 次
- 性别:
- 来自: 广西
文章分类
最新评论
-
李涤尘:
很好,很清晰的记录
Oracle 多表查询 -
yanxiaojia521:
项目部署成功后,使用localhost可以访问,在局域网内容访 ...
Linux系统下的项目部署 -
txlong_onz:
学好正则这些都不用记了。有的时候要灵活的。
文本框的输入限制
数据库设计五戒
众所周知,数据库设计的好坏直接关系到数据库运行的效率。根据笔者的经验,对于提升数据库性能来说,合理的数据库设计,比升级服务器的硬件配置,还要来的有效。但是,笔者无论是在跟同事合作,又或者是在论坛上跟相关同行交流的时候,总是会发现有些人有一些不好的数据库设计习惯,影响了数据库的性能,增加了数据库管理员的工作量。
笔者认为,为了提升数据库的性能,在Oracle数据库设计的时候,要做到五戒。
一戒:在小型表上不要建立索引。
毋庸置疑,索引可以提高数据库查询的效率。但是,俗话说,过之则不及。索引也必须用在合时的地方。如果索引设置不当,不但不会提升数据库的性能,反而会起到相反的作用。如在小型数据库上设置索引,而且这些表用户更改的比较频繁。如员工基本信息表,就是简单的不超过十个字段。这个表用户需要经常的进行插入与删除操作。当进行这些变更作业的时候,需要对索引进行维护。而这个维护的工作量可能比扫描表空间消耗更多的存储空间。从而不但起不到改善数据库性能的作用,反而是在拖后腿。
所以,在数据库设计的时候,要做到的第一个戒条就是,不要在用户经常更改的小型表上建立索引。否则的话,是得不偿失的。
二戒:不要用用户的键。
如我们在设计一个ERP系统数据库的时候,有一张销售订单表。在这张表中,有一个销售订单号。那么我们能否利用这个单号作为关联其他表的外键呢?如在销售出货单上,需要关联到销售订单。这个时候,我们能否把销售订单单号作为跟出货单关联的关键字呢?
答案是可以的,但是不是最优选择。我们可以看一下ERP的后台数据库。在销售订单表上,除了销售订单号这个唯一表示销售订单纪录的字段外,还有一个字段就是销售订单ID。在前台的出货单界面上虽然显示的是销售订单号码,但是,在后台却存储着的是销售订单ID。也就是说,数据库不是以用户的键作为主键,而是采用了数据库自动维护的单据ID这个字段。
为什么要这么设计呢?这就是笔者今天要谈的第二个戒条,不要用用户的键。通常情况下,不要选择用户可编辑的字段作为外键或者主键。因为这会增加我们额外的工作量。
如果我们把销售订单号作为外键的话,则在创建销售订单纪录后还要对用户编辑字段的行为施加限制,如判断是否违反外键的强制性规则等等。有些系统把销售订单号设置为外键的话,则往往是把这个字段设置为系统自动编号,并且用户不可更改。可是,在实际工作中,企业员工往往需要编辑这个字段。员工需要编辑这些不可编辑的字段时系统缺乏灵活性的缺陷就体现出来了。而且,当用户输入完数据保存的时候再提示纪录不符合要求,则也不是很人性化的设计。
另外,我们还必须为此设计一些检测和纠正键冲突的方法。如考虑这个外键的值是否在其他数据表中存在等等。虽然这通常只需要我们花点时间就可以搞定,但是从数据库性能上来说,这个代价就比较大了。再则,如此的话,就不能够很好的把系统的基本数据跟企业员工的数据实现很好的隔离。
所以,笔者认为,不要用用户的键来作为我们数据库设计的主键或者外键。或者说,数据库设计时用到的键要让数据库系统进行自动维护,用户不得更改这个维护规则。
三戒:不要用商务规则来实现数据的完整性。
数据的完整性有好几种实现方法。如可以通过数据库约束实现数据完整性;也可以通过前台系统的商务规则来实现数据的完整性。不过,笔者这里要建议的是,在一些大型的数据库中,不要试图通过商务规则来实现数据的完整性,而尽可能的通过数据库的约束来实现。因为若通过商务规则来实现完整性,往往会出现一些莫名其妙的错误。
如笔者就遇到过这一个案例。在数据库设计的时候,把某个字符型字段长度限制为最长50位。而在前台应用程序中,却限制了60位。在员工输入数据的时候,在前台应用程序中,可以输入55个字符。但是,下次用户查询的时候,却发现后面几个字符没有了,只剩下前面那些内容。这主要是因为在数据保存的时候,超过了数据库的最长位数限制。数据库就会自动把后面几个字符去掉然后保存。如此,用户在前台输入数据的时候,以为可以保存。但是,实际上数据库中存储的数据是不全的。
所以,笔者的第三个戒条就是,不要利用商务规则在前台实现数据的完整性。只要有可能,就要尽量在数据库系统层面实现数据的完整性。在数据库层面实现数据完整性的同时,需要注意用户的友好性。
一是要把违反约束信息尽可能详细的回馈给用户。如销售订单号,在数据库系统中设置了唯一性约束。则当用户在建立销售订单的时候,销售订单号重复时,就需要把这个约束的详细信息反馈给前台用户。若只显示不能够保存这个错误信息往往是不够的。这会让用户摸不着头脑。
二是在必要的时候,可以利用触发器来实现数据的完整性。虽然在功能设计上,我们不建议在Oracle数据库中采用触发器来实现。如要把某个小写金额转换为大小金额。我们是建议通过前台应用程序实现。因为应用程序的执行效率要比数据库的触发器高。但是,在数据库数据完整性上,在必要的时候,若靠数据库约束无法实现完整性,我们仍然建议采用触发器,而不是前台应用程序来实现。在任何情况下,不要依赖于应用程序来实现数据完整性。否则的话,很难保证数据库约束与商务层约束的一致性。
四戒:在可能的情况下,不要让前台应用程序直接访问数据表。
其实,在数据库基础表与前台应用程序之间,还有一个很好的“中间人”,那就是视图。视图是数据库基础表的一个抽象。他除了可以保障数据的质量外,还可以有效的访问前台应用程序对于数据的非法访问。所以,一些安全性级别比较高的数据库系统,在数据库设计的时候,往往会在数据库和前台应用程序代码之间提供“视图”这个中间人,让其作为基础表的“新闻发言人”。如此,前台应用程序在没有必要的情况下,可以不直接访问数据表,而是通过视图来对表实现间接的访问。
如在进行数据导入程序设计的时候,通过视图来实现则是一个很理想的方法。如用户现在要导入产品信息,包括产品基本信息、供应商信息、价格信息等等。这些信息在数据库中往往包含在三种表中,分别为产品基本信息表、供应商信息表、产品价格信息表。若前台应用程序直接访问基础表的话,就需要分别访问这三张基础表。这不但效率比较低,而且也不容易实现数据的完整性。此时,我们就可以利用视图,把一些必须要填入的字段组合在一张可更新视图中。如此,前台应用程序只需要访问一个数据库对象即可。
再者,在数据库报表设计上,更是要通过视图来实现。而不要通过传递一段SQL代码来查询基础表。这对于数据的安全性会带来比较大的威胁。
所以,第四个戒条就是,在可能的情况下,不要让前台应用程序直接访问数据表。
五戒:不要一直让用户输入数据。
有些字段其实不一定要让用户输入,只需要用户选择即可。如在人事管理系统中,企业员工所属的民族、职位、省份等等就没有必要让用户手工输入。而可以通过列表的形式让员工来进行选择。这种手段,是提高数据完整性的最佳方式之一。若能够给用户提供一个详细的列表供其选择,这样将减少键入代码的错误,同时提高数据库的一致性;也可以提高用户界面的友好性。
所以,在数据库设计的时候,尽量使用列表字段来供用户选择。若连省份等等字段都要用户手工输入的话,则我们在数据库完整性所花费的时间,就要很多。如在数据保存的时候,都要去判断用户输入的数据是否合乎完整性的规则。这显然工作量要比设计一个列表字段多得多。
故数据库设计的第五个戒条就是不要老是让用户手工输入数据。提供列表让用户进行选择,用户不仅可以提高效率,我们也可以省事,同时,也能够保障数据的准确率。
发表评论
-
ORACLE学习笔记系列(15)使用扩展的 GROUP BY 子句(四)
2014-01-12 19:48 0ORACLE学习笔记系列(15)使用扩展的 GROUP BY ... -
ORACLE学习笔记系列(15)使用扩展的 GROUP BY 子句(三)
2014-01-12 19:46 0ORACLE学习笔记系列(15)使用扩展的 GROUP BY ... -
ORACLE学习笔记系列(15)使用扩展的 GROUP BY 子句(二)
2014-01-12 19:45 0ORACLE学习笔记系列(15)使用扩展的 GROUP BY ... -
ORACLE学习笔记系列(15)使用扩展的 GROUP BY 子句
2014-01-12 19:54 1273ORACLE学习笔记系列(15)使用扩展的 GROU ... -
ORACLE学习笔记系列(14)聚合函数
2014-01-12 19:30 1287ORACLE学习笔记系列(14)聚合函数 常用的聚合 ... -
ORACLE学习笔记系列(13)转换函数
2014-01-12 19:28 511ORACLE学习笔记系列(13)转换函数 转换函数 ... -
ORACLE学习笔记系列(12)数字函数
2014-01-12 19:26 426ORACLE学习笔记系列(12)数字函数 数字函数 ... -
ORACLE学习笔记系列(11)字符函数
2014-01-12 19:25 560ORACLE学习笔记系列(11)字符函数 字符函数 ... -
ORACLE学习笔记系列(10)正则表达式
2014-01-11 12:41 2199ORACLE学习笔记系列(10 ... -
ORACLE学习笔记系列(9)通配符和特殊字符
2014-01-05 22:28 2380ORACLE学习笔记系列(9 ... -
ORACLE学习笔记系列(8)ORACLE中的空值(NULL)和与空值(NULL)有关的函数
2014-01-05 15:02 1398ORACLE学习笔记系列(8)ORACLE中的空值(NU ... -
ORACLE学习笔记系列(7)SQL语言分类
2013-12-29 19:57 919SQL语言的五大组成部分DQL DML DDL DCL ... -
ORACLE学习笔记系列--目录
2013-12-29 19:14 638ORACLE学习笔记系列--目录 ORACL ... -
ORACLE学习笔记系列(6)Outer Join新旧语法对比分析
2013-12-18 21:55 1392从Oracle9i开始,支持ANSI/ISO ... -
ORACLE学习笔记系列(5)连接查询和联合查询
2013-12-15 16:54 1097连接查询和联合查询 一、连接查询 通过连接运 ... -
ORACLE学习笔记系列(4)ORACLE优化器
2013-12-15 15:19 824Oracle优化器介绍 1 ... -
ORACLE学习笔记系列(3)SQLPLUS里的清屏命令
2013-12-15 15:05 688SQLPLUS里的清屏命令 方法一:同时按S ... -
ORACLE学习笔记系列(2)解决 SQLPLUS分析SQL语句出现 'PLAN_TABLE' is old version
2013-12-15 14:59 1064解决 SQLPLUS分析SQL语句出现 'PLAN_TAB ... -
ORACLE学习笔记系列(1)如何使用SQLPLUS分析SQL语句
2013-12-15 14:49 1114如何使用SQLPLUS分析SQL语句 ... -
Oracle 多表查询
2012-05-17 11:41 1237Oracle 多表查询 1. SQL语句的执行顺序 SE ...
相关推荐
网吧管理系统数据库设计和相关文档网吧管理系统数据库设计和相关文档网吧管理系统数据库设计和相关文档网吧管理系统数据库设计和相关文档以及相关报表网吧管理系统数据库设计和相关文档网吧管理系统数据库设计和相关...
掌握数据库设计基本步骤,包括数据库概念结构设计、逻辑结构设计,物理结构设计,数据库模式SQL语句生成。能够使用数据库设计工具进行数据库设计。 为某个部门或单位开发一个数据库应用系统,具体内容包括:对某个...
数据库设计 数据库设计 数据库设计 数据库设计 数据库设计
twitter数据库 twitter数据库设计 微博数据库设计
数据库设计5步骤数据库设计5步骤数据库设计5步骤数据库设计5步骤数据库设计5步骤数据库设计5步骤数据库设计5步骤数据库设计5步骤数据库设计5步骤数据库设计5步骤数据库设计5步骤数据库设计5步骤数据库设计5步骤...
Web数据库设计 Web数据库设计 Web数据库设计
微博 数据库 设计,数据库详细设计,网站数据库设计
crm数据库设计文档crm数据库设计文档
详细图文讲解数据库设计过程,觉得很不错、能对于初学者较好的理解
《自己动手设计数据库》主要讲述数据库的设计,讨论了如何建立表结构、确定主键、设置字段说明、建立表关系、确立业务规则、建立视图和各层次的数据完整性,以及如何避免不好的设计等问题。《自己动手设计数据库》...
shiro权限框架数据库设计,附少量数据,仅供测试,非实际项目
本数据库设计说明书是关于寝室管理系统数据库设计,主要包括数据逻辑结构设计、数据字典以及运行环境、安全设计等。 2、本数据库设计说明书读者:用户、系统设计人员、系统测试人员、系统维护人
模板-数据库设计说明书.doc 模板-数据库设计说明书.doc 模板-数据库设计说明书.doc 模板-数据库设计说明书.doc 模板-数据库设计说明书.doc
收费停车场管理系统数据库设计_数据库课程设计论文
多级目录数据库设计方案 在实际工作中,经常碰到需要多级目录的情况,例如设计一个论坛,它的版面是分级的,而且为了灵活扩展,这种分级是没有限制的,也就是说设计者,不限制用户设定多少级目录。
数据库设计指南.pdf数据库设计指南.pdf数据库设计指南.pdf数据库设计指南.pdf数据库设计指南.pdf数据库设计指南.pdf数据库设计指南.pdf数据库设计指南.pdf数据库设计指南.pdf数据库设计指南.pdf数据库设计指南.pdf...
药房药库管理系统数据库设计 针对于 药房药库管理系统所建的表
4.1 数据依赖 4.1.1 关系模式中的数据依赖 4.1.2数据依赖对关系模式的影响 4.1.3 有关概念 4.2 范式 4.2.1 第一范式( 1NF) 4.2.2 第二范式( 2NF) 4.2.3 第三范式( 3NF) 4.2.4 BC范式( BCNF) ...
学生宿舍管理系统数据库设计案例 一个完整的数据库设计案例。对设计过程有详细的分析过程。
关系数据库设计之基本规则