- 浏览: 452503 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zhengch00:
这个文档不是你自己写的吧
informatica连接ftp -
ctcwri:
于我心有慽慽焉,java的web就像陷入了泥坑。
Java 的纯真年代已经离我们越来越远了 -
bestxiaok:
Glorin 写道这个应该是你的安装目录tomcat文件夹下面 ...
Value must be an existing directory配置tomcat问题? -
Glorin:
这个应该是你的安装目录tomcat文件夹下面少了一个temp文 ...
Value must be an existing directory配置tomcat问题? -
bestxiaok:
sheep3600 写道bestxiaok 写道sheep36 ...
AES加密解密
第 3 部分 - 选择键和索引
数据采掘要预先计划
我所在的某一客户部门一度要处理 8 万多份联系方式,同时填写每个客户的必要数据(这绝对不是小活)。我从中还要确定出一组客户作为市场目标。当我从最开始设计表和字段的时候,我试图不在主索引里增加太多的字段以便加快数据库的运行速度。然后我意识到特定的组查询和信息采掘既不准确速度也不快。结果只好在主索引中重建而且合并了数据字段。我发现有一个指示计划相当关键--当我想创建系统类型查找时为什么要采用号码作为主索引字段呢?我可以用传真号码进行检索,但是它几乎就象系统类型一样对我来说并不重要。采用后者作为主字段,数据库更新后重新索引和检索就快多了。
可操作数据仓库(ODS)和数据仓库(DW)这两种环境下的数据索引是有差别的。在 DW 环境下,你要考虑销售部门是如何组织销售活动的。他们并不是数据库管理员,但是他们确定表内的键信息。这里设计人员或者数据库工作人员应该分析数据库结构从而确定出性能和正确输出之间的最佳条件。
使用系统生成的主键
这类同技巧 1,但我觉得有必要在这里重复提醒大家。假如你总是在设计数据库的时候采用系统生成的键作为主键,那么你实际控制了数据库的索引完整性。这样,数据库和非人工机制就有效地控制了对存储数据中每一行的访问。
采用系统生成键作为主键还有一个优点:当你拥有一致的键结构时,找到逻辑缺陷很容易。
分解字段用于索引
为了分离命名字段和包含字段以支持用户定义的报表,请考虑分解其他字段(甚至主键)为其组成要素以便用户可以对其进行索引。索引将加快 SQL 和报表生成器脚本的执行速度。比方说,我通常在必须使用 SQL LIKE 表达式的情况下创建报表,因为 case number 字段无法分解为 year、serial number、case type 和 defendant code 等要素。性能也会变坏。假如年度和类型字段可以分解为索引字段那么这些报表运行起来就会快多了。
键设计 4 原则
* 为关联字段创建外键。
* 所有的键都必须唯一。
* 避免使用复合键。
* 外键总是关联唯一的键字段。
别忘了索引
索引是从数据库中获取数据的最高效方式之一。95% 的数据库性能问题都可以采用索引技术得到解决。作为一条规则,我通常对逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列[字段]采用非成组索引。不过,索引就象是盐,太多了菜就咸了。你得考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写。
大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,比如运行查询显示主表和所有关联表的某条记录就用得上。还有,不要索引 memo/note 字段,不要索引大型字段(有很多字符),这样作会让索引占用太多的存储空间。
不要索引常用的小型表
不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。
不要把社会保障号码(SSN)或身份证号码(ID)选作键
永远都不要使用 SSN 或 ID 作为数据库的键。除了隐私原因以外,须知政府越来越趋向于不准许把 SSN 或 ID 用作除收入相关以外的其他目的,SSN 或 ID 需要手工输入。永远不要使用手工输入的键作为主键,因为一旦你输入错误,你唯一能做的就是删除整个记录然后从头开始。
我在破解他人的程序时候,我看到很多人把 SSN 或 ID 还曾被用做系列号,当然尽管这么做是非法的。而且人们也都知道这是非法的,但他们已经习惯了。后来,随着盗取身份犯罪案件的增加,我现在的同行正痛苦地从一大摊子数据中把 SSN 或 ID 删除。
不要用用户的键
在确定采用什么字段作为表的键的时候,可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。这样做会迫使你采取以下两个措施:
* 在创建记录之后对用户编辑字段的行为施加限制。假如你这么做了,你可能会发现你的应用程序在商务需求突然发生变化,而用户需要编辑那些不可编辑的字段时缺乏足够的灵活性。当用户在输入数据之后直到保存记录才发现系统出了问题他们该怎么想?删除重建?假如记录不可重建是否让用户走开?
* 提出一些检测和纠正键冲突的方法。通常,费点精力也就搞定了,但是从性能上来看这样做的代价就比较大了。还有,键的纠正可能会迫使你突破你的数据和商业/用户界面层之间的隔离。
所以还是重提一句老话:你的设计要适应用户而不是让用户来适应你的设计。
不让主键具有可更新性的原因是在关系模式下,主键实现了不同表之间的关联。比如,Customer 表有一个主键 CustomerID,而客户的定单则存放在另一个表里。Order 表的主键可能是 OrderNo 或者 OrderNo、CustomerID 和日期的组合。不管你选择哪种键设置,你都需要在 Order 表中存放 CustomerID 来保证你可以给下定单的用户找到其定单记录。
假如你在 Customer 表里修改了 CustomerID,那么你必须找出 Order 表中的所有相关记录对其进行修改。否则,有些定单就会不属于任何客户--数据库的完整性就算完蛋了。
如果索引完整性规则施加到表一级,那么在不编写大量代码和附加删除记录的情况下几乎不可能改变某一条记录的键和数据库内所有关联的记录。而这一过程往往错误丛生所以应该尽量避免。
可选键(候选键)有时可做主键
记住,查询数据的不是机器而是人。
假如你有可选键,你可能进一步把它用做主键。那样的话,你就拥有了建立强大索引的能力。这样可以阻止使用数据库的人不得不连接数据库从而恰当的过滤数据。在严格控制域表的数据库上,这种负载是比较醒目的。如果可选键真正有用,那就是达到了主键的水准。
我的看法是,假如你有可选键,比如国家表内的 state_code,你不要在现有不能变动的唯一键上创建后续的键。你要做的无非是创建毫无价值的数据。如你因为过度使用表的后续键[别名]建立这种表的关联,操作负载真得需要考虑一下了。
别忘了外键
大多数数据库索引自动创建的主键字段。但别忘了索引外键字段,它们在你想查询主表中的记录及其关联记录时每次都会用到。还有,不要索引 memo/notes 字段而且不要索引大型文本字段(许多字符),这样做会让你的索引占据大量的数据库空间。
第 4 部分 - 保证数据的完整性
用约束而非商务规则强制数据完整性
如果你按照商务规则来处理需求,那么你应当检查商务层次/用户界面:如果商务规则以后发生变化,那么只需要进行更新即可。假如需求源于维护数据完整性的需要,那么在数据库层面上需要施加限制条件。如果你在数据层确实采用了约束,你要保证有办法把更新不能通过约束检查的原因采用用户理解的语言通知用户界面。除非你的字段命名很冗长,否则字段名本身还不够。
只要有可能,请采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上。
分布式数据系统
对分布式系统而言,在你决定是否在各个站点复制所有数据还是把数据保存在一个地方之前应该估计一下未来 5 年或者 10 年的数据量。当你把数据传送到其他站点的时候,最好在数据库字段中设置一些标记。在目的站点收到你的数据之后更新你的标记。为了进行这种数据传输,请写下你自己的批处理或者调度程序以特定时间间隔运行而不要让用户在每天的工作后传输数据。本地拷贝你的维护数据,比如计算常数和利息率等,设置版本号保证数据在每个站点都完全一致。
强制指示完整性(参照完整性?)
没有好办法能在有害数据进入数据库之后消除它,所以你应该在它进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。
关系
如果两个实体之间存在多对一关系,而且还有可能转化为多对多关系,那么你最好一开始就设置成多对多关系。从现有的多对一关系转变为多对多关系比一开始就是多对多关系要难得多。
采用视图
为了在你的数据库和你的应用程序代码之间提供另一层抽象,你可以为你的应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。
给数据保有和恢复制定计划
考虑数据保有策略并包含在设计过程中,预先设计你的数据恢复过程。采用可以发布给用户/开发人员的数据字典实现方便的数据识别同时保证对数据源文档化。编写在线更新来"更新查询"供以后万一数据丢失可以重新处理更新。
用存储过程让系统做重活
解决了许多麻烦来产生一个具有高度完整性的数据库解决方案之后,我决定封装一些关联表的功能组,提供一整套常规的存储过程来访问各组以便加快速度和简化客户程序代码的开发。数据库不只是一个存放数据的地方,它也是简化编码之地。
使用查找
控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找:国家代码、状态代码等。
第 5 部分 - 各种小技巧
文档、文档、文档
对所有的快捷方式、命名规范、限制和函数都要编制文档。
采用给表、列[字段]、触发器等加注释的数据库工具。是的,这有点费事,但从长远来看,这样做对开发、支持和跟踪修改非常有用。
取决于你使用的数据库系统,可能有一些软件会给你一些供你很快上手的文档。你可能希望先开始在说,然后获得越来越多的细节。或者你可能希望周期性的预排,在输入新数据同时随着你的进展对每一部分细节化。不管你选择哪种方式,总要对你的数据库文档化,或者在数据库自身的内部或者单独建立文档。这样,当你过了一年多时间后再回过头来做第 2 个版本,你犯错的机会将大大减少。
使用常用英语(或者其他任何语言)而不要使用编码
为什么我们经常采用编码(比如 9935A 可能是'青岛啤酒'的供应代码,4XF788-Q 可能是帐目编码)?理由很多。但是用户通常都用英语进行思考而不是编码。工作 5 年的会计或许知道 4XF788-Q 是什么东西,但新来的可就不一定了。在创建下拉菜单、列表、报表时最好按照英语名排序。假如你需要编码,那你可以在编码旁附上用户知道的英语。
保存常用信息
让一个表专门存放一般数据库信息非常有用。我常在这个表里存放数据库当前版本、最近检查/修复(对 FoxPro)、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库,当客户抱怨他们的数据库没有达到希望的要求而与你联系时,这样做对非客户机/服务器环境特别有用。
测试、测试、反复测试
建立或者修订数据库之后,必须用用户新输入的数据测试数据字段。最重要的是,让用户进行测试并且同用户一道保证你选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。
检查设计
在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说,针对每一种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据
发表评论
-
JAVA 程序中使用ORACLE 绑定变量( bind variable )
2012-08-17 10:45 28841、为什么要使用绑定变量 (1)SQL语 句硬分 ... -
oracle加 行锁
2012-06-13 13:19 1653加锁是为了防止一些操作而进行的,比如说共享锁,可以防止 ... -
update多列更新
2012-04-05 16:06 1951再ETL的时候,经常会遇到列转换的问题,再对照转换中出现多列更 ... -
oracle数据库间数据快速 复制
2012-03-26 15:59 1989一种利用dblink模式: 1 Create public ... -
Can't open a connection to site 'SYB_BACKUP' 解决办法
2012-02-08 10:56 2059把可能遇到的情况总结一下: 1、出错该错误可以先检查一下Syb ... -
数据库知识:Oracle服务的知识详解
2012-01-06 14:40 1147Oracle数据库的操作中, ... -
UNION替换OR效率测试及总结
2011-11-09 17:11 1108大家在做SQL优化的过程中,可能都知道一个事实:某些情况下使用 ... -
update 多表更新
2011-11-09 15:35 1014在开发中,数据库来回换,而有些关键性的语法又各不相同,这是一件 ... -
ora-00957:duplicate column name
2011-11-07 16:49 2417ora-00957:duplicate column name ... -
Oracle: ORA-01000: 超出打开游标的最大数问题
2011-11-02 09:53 1783java.sql.SQLException: ORA-0100 ... -
几种常用的数据库分页
2011-11-01 22:33 12101.oracle数据库分页 select * from (se ... -
查看当前数据库全表扫描的SQL
2011-07-22 16:07 2112在大数据操作表的时候经常会遇到查询慢的问题,有的时候的确是数据 ... -
oracle flashback闪回技术
2011-07-21 16:13 946今天在操作数据库的时候,由于登陆的时候没有认真看数据库名,导致 ... -
oracle flashback闪回技术
2011-07-21 16:13 922今天在操作数据库的时候,由于登陆的时候没有认真看数据库名,导致 ... -
oracle临时表空间
2011-07-20 15:57 1121以下是在学习中学到的一些关于临时表空间的语句: --1、查看临 ... -
导入导出csv文件(PL/SQL Developer)
2011-07-13 19:13 2026在运用与数据库有关的操作时,总是会与数据的导入导出打交道。因此 ... -
SQL查询原理及执行顺序
2011-07-06 16:00 6485一、sql语句的执行步骤: 1)语法分析,分析语句的语法是否符 ... -
oracle基本结构
2011-06-29 19:59 1010Oracle服务器=Oracle实例+数据库(物理组件) a ... -
Oracle dba和sysdba的区别
2011-05-18 16:42 1044之前老是把dba和sysdba混为一体,今天看到论坛在讨论两者 ... -
oracle字符串转换
2011-05-04 20:03 1528今天看代码,看到不少代码显示的时候拼接字符串用的是substr ...
相关推荐
根据“3分技术,7分经验”的原则,本文将通过分析不同水平的数据库设计者的特点,探讨数据库设计中的技巧与经验。 #### 二、数据库设计者的分类及特点 1. **未系统学习数据结构的程序员**:这类程序员设计的数据库...
数据库设计是软件开发过程中的关键环节,尤其是在大数据和云计算时代,高效、稳定、灵活的数据库设计对于系统的性能、可扩展性和数据安全性具有决定性影响。本文将深入探讨数据库设计的一些重要技巧,帮助程序员提升...
浅谈数据库设计技巧.mht
4. **精通数据库设计的高级程序员**:在积累了大量经验之后,这类程序员能够预见未来需求的变化,设计出具备前瞻性的数据库结构,减少未来的重构成本。 5. **数据库管理系统开发者**:这类程序员不仅精通数据库设计...
在ASP.NET框架中,数据库控件是开发人员用来高效地显示和操作数据的关键工具。本文将深入探讨五种主要的数据库控件:GridView、DataList、Repeater、DetailsView和FormView,它们各自有其独特的特性和应用场景。 ...
老程序员工作笔记,五年以上的开发人员在工作中积累的经验,可以帮组很多新手,你值得拥有。
【数据库设计技巧】 数据库设计是IT领域中至关重要的一部分,它涉及到如何有效地组织和存储数据,以便于高效地访问和管理。本文将探讨一些数据库设计的关键技巧,尤其关注SQL语句的使用。 首先,数据结构是数据库...
数据库设计是信息系统开发的核心环节,它涉及到数据的高效存储、查询和管理,以满足不同应用场景下的用户需求。本文主要探讨了数据库设计的六个关键阶段,包括需求分析、概念结构设计、逻辑结构设计、物理结构设计、...
因此,数据库设计是一个需要专业知识和丰富经验的工作。 在数据库应用中,索引的设计和优化是提升查询效率的有效手段。合理地使用索引可以显著提高数据检索的速度,减少磁盘I/O操作,从而提升系统性能。然而,索引...
数据库设计是软件开发过程中的关键环节,它直接影响到系统的稳定性、可靠性和可扩展性。本文主要探讨了数据库设计的方法和技巧,旨在帮助数据库设计人员更好地理解和实践这一领域。 首先,设计前的准备工作至关重要...
实时数据库系统设计是IT领域中一个关键的子领域,它主要关注如何构建和优化系统以高效处理和存储实时数据。这种系统广泛应用于自动化、监控、制造业和其他需要快速响应时间的应用中。以下是对实时数据库系统设计的...
5. **数据字典**:详细列出所有数据项的定义、来源、格式和使用情况,为后续的数据库设计提供参考。 6. **数据库结构设计**: - **概念设计**:通过E-R图(实体-关系图)将现实世界中的实体、属性和关系抽象出来,...
【Oracle数据库优化设计】主要涉及到数据库的架构优化、内存管理、表设计和索引优化等方面,以下是详细的阐述: 1. **数据库优化设计**:Oracle数据库的优化设计主要包括对数据的逻辑结构进行合理的规划,例如采用...
浅谈基于MySQL数据库结构设计 本文将围绕MySQL数据库结构设计进行讨论,旨在帮助读者更好地理解和应用MySQL数据库。 MySQL是一个开源的关系型数据库管理系统,它使用了一种名为Structured Query Language(SQL)的...
### DB2 数据库调优浅谈 #### 数据库调优的视角 在进行数据库调优时,不同的视角可能会带来不同的解决方案。通常来说,可以从以下几个方面考虑: - **应用优化**:针对应用程序本身的优化,比如查询逻辑、事务...
“浅谈数据库及表设计的几个原则”可能涵盖了如下的设计原则: 1. 尽量减少数据冗余,通过规范化来消除重复信息,防止数据不一致。 2. 设计合适的索引以加速查询,但也要注意索引过多会增加写操作的开销。 3. 设计...
5. 安全性设计:确保数据库中的数据安全和完整性是数据库设计中不可或缺的一部分,需要在设计阶段考虑数据备份和恢复策略,以及权限控制机制。 优化设计方面,需要关注的是: 1. SQL语句优化:通过优化SQL语句提高...
在Oracle数据库设计中,表的构建是至关重要的基础工作,对数据库性能的影响深远。良好的表设计能显著提升数据库效率。本文主要针对Oracle初学者,介绍一些实用的设计技巧。 首先,关于列的顺序设计,尤其是允许NULL...