`

如何设计一个数据库才是高性能合理科学的(三)

阅读更多


第 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 字段而且不要索引大型文本字段(许多字符),这样做会让你的索引占据大量的数据库空间
分享到:
评论

相关推荐

    仓库设备管理系统数据库设计(DOC 19页).doc

    数据库设计是计算机科学的一个重要分支,它为企业或组织提供了一个高效率的信息基础设施和运行环境。数据库设计的目标是为用户和各种应用系统提供一个高效率的运行环境,包括数据库数据的存取效率、数据库存储空间的...

    数据库课程设计设计指导书-最新.pdf

    《数据库原理及应用》课程设计指导书 2008 级计算机科学与技术专业 第 1 页 共 20 页 计算机科学与技术专业 数据库原理及应用 课 程 设 计 教学实验指导书 《数据库原理及应用》课程设计指导书 2008 级计算机科学与...

    数据库原理课程设计---医院管理系统.doc

    该系统的主要目标是提高医院管理工作的效率,减少相关人员的工作量,使医院管理工作真正做到科学、合理的规划,系统、高效的实施。 二、系统总体框架 医院管理系统的总体框架包括挂号信息添加、信息查询、退出系统...

    教学管理信息系统—教师数据库设计.doc

    " " " "学 号: " " 课 程 设 计 "题 目 "教学管理信息系统—教师数据库 " " "设计 " "学 院 "计算机科学与技术学院 " "专 业 " " "班 级 " " "姓 名 " " "指导教师 "唐祖锴 " "2013 "年"01 "月"09 "日 " 课程设计...

    人力资源管理系统数据库设计(2).doc

    《数据库系统原理》课程设计报告 项目名称:人力资源管理系统数据库设计 专 业: 计算机科学与技术 年 级: 姓 名: 学 号: 指导老师: (副教授) 2013年9月 摘 要 伴随着时代的进步,计算机已成为现代人不可或缺的...

    [高性能MySQL(第3版)].Baron.Scbwartz等.扫描版

     《高性能MySQL(第3版)》不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,相信都能从本书有所收获。 ★每一章均别具匠心,力求理论与实践的精确平衡,且布满无价之宝,...

    Bosent技术架构设计文档

    * 高性能:确保系统的设计是高性能和高效率的 ### 架构模式 Bosent技术架构设计的架构模式是基于以下几点: * 分层架构:将系统分为不同的层次,以便于维护和扩展 * 微服务架构:将系统拆分为多个微服务,以便于...

    vf学生公寓管理系统 信息与计算科学的课程设计

    数据库设计 软件攻城设计 课程实习 带word文档 一. 可行性研究 并不是所有问题都有合理的解决办法,事实上许多问题不可能在预定的系统规模之内解决。如果问题没有可行的解决,那么花费在这项开发工程上的任何时间...

    开发基于Oracle数据库的管理信息系统

    开发高水平的“管理信息系统”,选择性能优越的数据库是最重要的一环,我们经过多方面的调研和分析,选择了ORACLE7数据库,成功地开发了本系统。实践证明,本系统设计科学、合理、运行稳定,本文将具体阐述一下系统...

    名片管理系统设计报告和代码分析

    Hibernate 是一个基于Java 的持久层框架,能够帮助开发者快速构建高质量的数据库应用程序。Hibernate 提供了许多有用的功能,例如对象关系映射、数据缓存、事务管理等。 知识点5:JSP 技术 JSP(JavaServer Pages)...

    ssm程序设计实践项目管理系统+java开题报告.doc

    SSM 框架集由 Spring、SpringMVC、MyBatis 三个开源框架整合而成,能够快速地开发出一个高性能的 Web 应用程序。 系统的设计要求包括: * 完成程序设计实践项目管理系统的设计与实现,并实现本系统的主要功能,且...

    基于php的毕业设计管理系统开题报告.docx

    系统主要分为学生、教师、管理员三个端,每个端都有其特定的功能,例如学生端可以查看和修改个人信息、查看通知、分组查看、选题查看、设计提交、查看得分、交流提问、修改密码等。 教师端可以查看和修改学生信息、...

    学籍管理系统软件设计说明书

    预处理的窗口正常情况下和峰值工作条件下为5个,一定时间周期中要处理的数据的数量:窗口开始尺寸2个数据、开始位置2个数据、最大尺寸2个数据、最小尺寸2个数据、编辑框位置4个数据、按钮位置4个数据,平均处理的...

    本科毕业设计开题报告(学生电子作业提交与分析系统的设计与实现V2)

    Microsoft SQL Server 2005数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,是程序员可以构建和管理用于业务的高可用和高性能的数据应用程序。 六、研究方法 该毕业设计采用的研究方法主要有文献法...

    简析可扩展计算机网络设计软件系统设计.docx

    其可扩展功能主要体现在三个方面: 1.1 计算机网络设计软件系统的功能向性能分析方面扩展 随着科学技术的不断发展与进步, 网络信息技术也逐渐走向成熟, 计算机网络设计软件技术开发者能够运用先进的网络性能模型对...

    C#学生信息数据库管理系统.pdf

    1.2 项目目标 本章以学校的学生信息管理为依托, 结合教务教学管理, 设计并开发一个学生信息管理 系统,提供一个信息更新快捷、管理方便、功能设置合理的学生信息管理解决方案。针对学 校大量的学生信息,就学生...

    学生学籍系统软件工程报告完成态.doc

    学生学籍系统软件工程报告完成态需要设计一个清晰、合理的系统架构,以满足系统的功能和性能要求。 2. 数据库设计:数据库设计是指系统中的数据库结构和数据模型的设计。学生学籍系统软件工程报告完成态需要设计一个...

    电子商务网站设计原理(五).txt

    2、系统设计:又称为物理设计,系统设计通常可分为两个阶段进行,首先是总体设计,其任务是设计系统的框架和概貌,并向用户单位做详细报告,在此基础上进行第二阶段----详细设计,这两个部分工作是互相联系的需要...

    UNIX高级编程 计算机科学丛书

    6. 实例—一个数据库的函数库(第十六章)、与Postscrip打印机的通信(第十七章)、调制解调器拨号程序(第十八章)以及使用伪终端(第十九章)。 如果对C语言较熟悉并具有某些应用Unix的经验,那么对阅读本书是...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

Global site tag (gtag.js) - Google Analytics