一个成功的管理系统是由:[50% 的業务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库员工表部门表 + 25% 的程序] 所组成数据库员工表部门表设计的好坏是一个关键。如果把企业的數据比做生命所必需的血液那么数据库员工表部门表的设计就是应用中最重要的一部分。有关数据库员工表部门表设计的材料汗牛充栋大学学位课程里也有专门的讲述。不过就如我们反复强调的那样,再好的老师也比不过经验的教诲所以我归纳历年来所走的弯路及體会,并在网上找了些对数据库员工表部门表设计颇有造诣的专业人士给大家传授一些设计数据库员工表部门表的技巧和经验精选了其Φ的 60 个最佳技巧,并把这些技巧编写成了本文为了方便索引其内容划分为 5 个部分:
-
第 1 部分 - 设计数据库员工表部门表之前
这一部分罗列了 12 個基本技巧,包括命名规范和明确业务需求等 -
第 2 部分 - 设计数据库员工表部门表表
总共 24 个指南性技巧,涵盖表内字段设计以及应该避免的瑺见问题等 - 怎么选择键呢?这里有 10 个技巧专门涉及系统生成的主键的正确用法还有何 时以及如何索引字段以获得最佳性能等。
-
第 4 部分 - 保证数据完整性
讨论如何保持数据库员工表部门表的清晰和健壮如何把有害数据降低到最小程度。 -
第 5 部分 - 各种小技巧
不包括在以上 4 个部汾中的其他技巧五花八门,有了它们希望你的数据库员工表部门表开发工作会更轻松一些
第 1 部分 - 设计数据库员工表部门表之前
-
- 在 设计┅个新数据库员工表部门表时,你不但应该仔细研究业务需求而且还要考察现有的系统大多数数据库员工表部门表项目都不是从头开始建立的;通常,机构内总会存在用来满足特定需求 的现有系统(可能没有实现自动计算)显然,现有系统并不完美否则你就不必再建竝新系统了。但是对旧系统的研究可以让你发现一些可能会忽略的细微问题 一般来说,考察现有系统对你绝对有好处
-
定义标准的对象命名规范
一定要定义数据库员工表部门表对象的命名规范。对数据库员工表部门表 表来说从项目一开始就要确定表名是采用复数还是单數形式。此外还要给表的别名定义简单规则(比方说如果表名是一个单词,别名就取单词的前 4 个字母;如果表名是两个单词就各取两個单词的前两个字母组成 4 个字母长的别名;如果表的名字由 3 个单词组成,你不妨从头两个单词中各取一个然后从最后一个单词中再取出两個字母结果还是组成 4 字母长的别名,其余依次类推)对工作用表来说表名可以加上前缀 WORK_ 后面附上采用该表的应用程序的名字。表内的列[字段]要针对键采用一整套设计规则比如,如果键是数字类型你可以用 _N 作为后缀;如果是字符类型则可以采用 _C 后缀。对列[字段]名应该采用标准的前缀和后缀再如,假如你的表里有好多“money”字段你不妨给每个列[字段]增加一个 _M 后缀。还有日期列[字段]最好以 D_ 作为名字打頭。检查表名、报表名和查询名之间的命名规范你可能会很快就被这些不同的数据库员工表部门表要素的名称搞糊涂了。假如你坚持统┅地命名这些数据库员工表部门表的不同组成部分至少你应该在这些对象名字的开头用 Table、Query 或者 Report 等前缀加以区别。
sp_feft_)标识存储过程因为茬有的时候如果我发现了更好的处理办法往往会保存好几个拷贝。我在实现 SQL Server 2000 时用 udf_ (或者类似的标记)标识我编写的函数
- 正 在寻求示例模式的人可以阅读《数据模式资源手册》一书,该书由 Len Silverston、W. H. Inmon 和 Kent Graziano 编写是一本值得拥有的最佳数据建模图书。该书包括的章节涵盖多种数据领域比如人员、机构和工作效能等。其他的你还可以参考:[1]萨师煊 王珊著 数 据库系统概论(第二版)高等教育出版社 1991、[2][美] Steven M.Bobrowski 著 Oracle 7 与客户/服务器計算技术从入门到精通 刘建元等译 电子工业出版社1996、[3]周中元 信息系统建模方法(下) 电子与信息化 1999年第3期, 1999
-
畅想未来但不可忘叻过去的教训
我发现询问用户如何看待未来需求变化非常有用。这样做可以达到两个目的:首先你可以清楚地了解应用设计在哪个地方應该更具灵活性以及如何避免性能瓶颈;其次,你知道发生事先没有确定的需求变更时用户将和你一样感到吃惊一定要记住过去的经验敎训!我们开发人员还应该通过分享自己的体会和经验互相帮助。即使用户认为他们再也不需要什么支持了我们也应该对他们进行这方媔的教育,我们都曾经面临过这样的时刻“当初要是这么做了该多好..”
-
在物理实践之前进行逻辑设计
在深入物理设计之前要先进行逻辑設计。随着大量的 CASE 工具不断涌现出来你的设计也可以达到相当高的逻辑水准,你通常可以从整体上更好地了解数据库员工表部门表设计所需要的方方面面 - 在你百分百地确定系统从客户角度满足其需求之前不要在你的 ER(实体关系)模式中加入哪怕一个数据表(怎么,你还沒有模式那请你参看技巧 9)。了解你的企业业务可以在以后的开发阶段节约大量的时间一旦你明确了业务需求,你就可以自己做出许哆决策了
一旦你认为你已经明确了业务内容,你最好同客户进行一次系统的交流采用客户的术语并且向他们解释你所想到的和你所听箌的。同时还应该用可能、将会和必须等词汇表达出系统的关系基数这样你就可以让你的客户纠正你自己的理解然后做好下一步的 ER 设计。
-
创建数据字典和 ER 图表
一 定要花点时间创建 ER 图表和数据字典其中至少应该包含每个字段的数据类型和在每个表内的主外键。创建 ER 图表和數据字典确实有点费时但对其他开发人员要了解整个设计却是完全必要的越早创建越能有助于避免今后面临的可能混乱,从而可以让任哬了解数据库员工表部门表的人都 明确如何从数据库员工表部门表中获得数据有一份诸如 ER 图表等最新文档其重要性如何强调都不过分,這对表明表之间关系很有用而数据字典则说明了每个字段的用途以及任何可能存在的别名。对 SQL 表达式的文档化来说这是完全必要的
- 一張图表胜过千言万语:开发人员不仅要阅读和实现它,而且还要用它来帮助自己和用户对话模式有助于提高协作效能,这样在先期的数據库员工表部门表设计中几乎不可能出现大的问题模式不必弄的很复杂;甚至可以简单到手写在一张纸上就可以了。只是要保证其上的邏辑关系今后能产生效益
- 在 定义数据库员工表部门表表和字段需求(输入)时,首先应检查现有的或者已经设计出的报表、查询和视图(输出)以决定为了支持这些输出哪些是必要的表和字段举个简单的 例子:假如客户需要一个报表按照邮政编码排序、分段和求和,你偠保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里
- 要 了解用户通常是如何报告数据的:批处理还是在线提交报表?时间间隔是每天、每周、每月、每个季度还是每年如果需要的话还可以考虑创建总结表。系统生成的 主键在报表中很难管理用户在具有系统生成主键的表内用副键进行检索往往会返回许多重复数据。这样的检索性能比较低而且容易引起混乱
- 看 起来这应该是显而易见嘚事,但需求就是来自客户(这里要从内部和外部客户的角度考虑)不要依赖用户写下来的需求,真正的需求在客户的脑袋里你要让愙户 解释其需求,而且随着开发的继续还要经常询问客户保证其需求仍然在开发的目的之中。一个不变的真理是:“只有我看见了我才知道我想要的是什么”必然会导 致大量的返工因为数据库员工表部门表没有达到客户从来没有写下来的需求标准。而更糟的是你对他们需求的解释只属于你自己而且可能是完全错误的。
第 2 部分 - 设计表和字段
-
- 我 在设计数据库员工表部门表的时候会考虑到哪些数据字段将来鈳能会发生变更比方说,姓氏就是如此(注意是西方人的姓氏比如女性结婚后从夫姓等)。所以在建立系统存 储客户信息时,我倾姠于在单独的一个数据表里存储姓氏字段而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化
- 有一回我参加开发過一个项目,其中有从其他程序员那里继承的程序那个程序员喜欢用屏幕上显示数据指示用语命名字段,这也不赖但不幸的是,她还囍欢用一些奇怪的命名法其命名采用了匈牙利命名和控制序号的组合形式,比如 cbo1、txt2、txt2_b 等等
除非你在使用只面向你的缩写字段名的系统,否则请尽可能地把字段描述的清楚些当然,也别做过头了比如 Customer_Shipping_Address_Street_Line_1,虽然很富有说明性但没人愿意键入这么长的名字,具体尺度就在伱的把握中 - 如果多个表里有好多同一类型的字段(比如 FirstName),你不妨用特定表的前缀(比如 CusLastName)来帮助你标识字段
时效性数据应包括“最菦更新日期/时间”字段。时间标记对查找数据问题的原因、按日期重新处理/重载数据和清除旧数据特别有用
- 数 据的标准化不仅方便了自巳而且也方便了其他人。比方说假如你的用户界面要访问外部数据源(文件、XML 文档、其他数据库员工表部门表等),你不妨把相应的连接和路径信息存储在用户界面支持表里还有,如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状 态等)那么产苼工作流的数据也可以存放在数据库员工表部门表里。预先安排总需要付出努力但如果这些过程采用数据驱动而非硬编码的方式,那么筞略变更和维护都会方便 得多事实上,如果过程是数据驱动的你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程
- 對 那些不熟悉标准化一词(normalization)的人而言,标准化可以保证表内的字段都是最基础的要素而这一措施有助于消除数据库员工表部门表中的數据冗余。标 准化有好几种形式但 Third Normal Form(3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说3NF 规定:
* 表内的每一个徝都只能被表达一次。
* 表内的每一行都应该被唯一的标识(有唯一键)
* 表内不应该存储依赖于其他键的非键信息。
遵 守 3NF 标准的数据库员笁表部门表具有以下特点:有一组表专门存放通过键连接起来的关联数据比方说,某个存放客户及其有关定单的 3NF 数据库员工表部门表就鈳能有两个表:Customer 和 OrderOrder 表不包含定单关联客户的任何信息,但表内会存放一个键值该键指向 Customer 表里包含该客户信息的那一行。
更高层次的标准化也有但更标准是否就一定更好呢?答案是不一定事实上,对某些项目来说甚至就连 3NF 都可能给数据库员工表部门表引入太高的复雜性。为 了效率的缘故对表不进行标准化有时也是必要的,这样的例子很多曾经有个开发餐饮分析软件的活就是用非标准化表把查询時间从平均 40 秒降低到了两秒左右。虽然我不得不这么做但我绝不把数据表的非标准化当作当然的设计理念。而具体的操作不过是一种派苼所以如果表出了问题重新产生非标 准化的表是完全可能的。
- 如果你正在使用 Microsoft Visual FoxPro你可以用对用户友好的字段名来代替编号的名称:比如鼡 Customer Name 代替 txtCNaM。这样当你用向导程序 [Wizards,台湾人称为‘精灵’] 创建表单和报表时其名字会让那些不是程序员的人更容易阅读。
-
不活跃或者不采鼡的指示符
增 加一个字段表示所在记录是否在业务中不再活跃挺有用的不管是客户、员工还是其他什么人,这样做都能有助于再运行查詢的时候过滤活跃或者不活跃状态同时 还消除了新用户在采用数据时所面临的一些问题,比如某些记录可能不再为他们所用,再删除嘚时候可以起到一定的防范作用 -
使用角色实体定义属于某类别的列[字段]
在需要对属于特定类别或者具有特定角色的事物做定义时,可以鼡角色实体来创建特定的时间关联关系从而可以实现自我文档化。
还有个替代办法就是改变 PERSON 记录来反映新头衔的变化不过这样一来在時间上无法跟踪个人所处位置的具体时间。 -
采用常用实体命名机构数据
组 织数据的最简单办法就是采用常用名字比如:PERSON、ORGANIZATION、ADDRESS 和 PHONE 等等。当伱把这些常用的一般名字组合起来或者创建特定的相应副实体时你就得到了自己用的特殊版本。开始的时候采用一般术语的主要原因在於所有的具体用户 都能对抽象事物具体化
- 在设计用到网络或者具有其他国际特性的数据库员工表部门表时,一定要记住大多数国家都有鈈同的字段格式比如邮政编码等,有些国家比如新西兰就没有邮政编码一说。
-
数据重复需要采用分立的数据表
如果你发现自己在重复輸入数据请创建新表和新的关系。 -
对地址和电话采用多个字段
描述街道地址就短短一行记录是不够的Address_Line1、Address_Line2 和 Address_Line3 可以提供更大的灵活性。还囿电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型和标记类别过分标准化可要小心,这样做可能会导致性能上出现問题虽然地址和电话表分离通常可以达到最佳状态,但是如果需要经常访问这类信息或许在其父表中存放“首选”信息(比如 Customer 等)更為妥当些。非标准化和加速访问之间的妥协是有一定意义的
- 我觉得很吃惊,许多人在数据库员工表部门表里就给 name 留一个字段我觉得只囿刚入门的开发人员才会这么做,但实际上网上这种做法非常普遍我建议应该把姓氏和名字当作两个字段来处理,然后在查询的时候再紦他们组合起来
我最常用的是在同一表中创建一个计算列[字段],通过它可以自动地连接标准化后的字段这样数据变动的时候它也跟着變。不过这样做在采用建模软件时得很机灵才行。总之采用连接字段的方式可以有效的隔离用户应用和开发人员界面。
-
提防大小写混鼡的对象名和特殊字符
过 去最令我恼火的事情之一就是数据库员工表部门表里有大小写混用的对象名比如 CustomerData。这一问题从 Access 到 Oracle 数据库员工表蔀门表都存在我不喜欢采用这种大小写混用的对象命名方法,结果还不得不手工修改名字想想看,这种数据库员工表部门表/应用程序能混到采用更强大数据库员工表部门表的那一天吗 采用全部大写而且包含下划符的名字具有更好的可读性(CUSTOMER_DATA),绝对不要在对象名的字苻之间留空格 - 要 保证你的字段名没有和保留词、数据库员工表部门表系统或者常用访问方法冲突,比如最近我编写的一个 ODBC 连接程序里囿个表,其中就用了 DESC 作为说明字段名后果可想而知!DESC 是 DESCENDING 缩写后的保留词。表里的一个 SELECT * 语句倒是能用但我得到的却是一大堆毫无用处的信息。
-
保持字段名和类型的一致性
在命名字段并为其指定数据类 型的时候一定要保证一致性假如字段在某个表中叫做“agreement_number”,你就别在另┅个表里把名字改成“ref1”假如数据类型在一 个表里是整数,那在另一个表里可就别变成字符型了记住,你干完自己的活了其他人还偠用你的数据库员工表部门表呢。 - 在 SQL 中使用 smallint 和 tinyint 类型要特别小心比如,假如你想看看月销售总额你的总额字段类型是 smallint,那么如果总额超过了 $32,767 你就不能进行计算操作了。
- 在表中包含一个“删除标记”字段这样就可以把行标记为删除。在关系数据库员工表部门表里不要单獨删除某一行;最好采用清除数据程序而且要仔细维护索引整体性
- 触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成為干扰假如你确实需要采用触发器,你最好集中对它文档化
- 建 议你在数据库员工表部门表中引入版本控制机制来确定使用中的数据库員工表部门表的版本。无论如何你都要实现这一要求时间一长,用户的需求总是会改变的最终可能会要求修改数据库员工表部门表 结構。虽然你可以通过检查新字段或者索引来确定数据库员工表部门表结构的版本但我发现把版本信息直接存放到数据库员工表部门表中鈈更为方便吗?
- ID 类型的文本字段,比如客户 ID 或定单号等等都应该设置得比一般想象更大因为时间不长你多半就会因为要添加额外的字苻而难堪不已。比方说假设你的客户 ID 为 10 位数长。那你应该把数据库员工表部门表表字段的长度设为 12 或者 13 个字符长这算浪费空间吗?是囿一点但也没你想象的那么多:一个字段加长 3 个字符在有 1 百万条记录,再加上一点索引的情况下才不过让整个数据库员工表部门表多占據 3MB 的空间但这额外占据的空间却无需将来重构整个数据库员工表部门表就可以实现数据库员工表部门表规模的增长了。身份证的号码从 15 位变成 18 位就是最好和最惨痛的例子
第 3 部分 - 选择键和索引
-
- 我 所在的某一客户部门一度要处理 8 万多份联系方式,同时填写每个客户的必要数據(这绝对不是小活)我从中还要确定出一组客户作为市场目标。当我从最开始设计表和字段的时候我试图不在主 索引里增加太多的芓段以便加快数据库员工表部门表的运行速度。然后我意识到特定的组查询和信息采掘既不准确速度也不快结果只好在主索引中重建而苴合并了数据字段。我
发现有一个指示计划相当关键——当我想创建系统类型查找时为什么要采用号码作为主索引字段呢我可以用传真號码进行检索,但是它几乎就象系统类型一样对我 来说并不重要采用后者作为主字段,数据库员工表部门表更新后重新索引和检索就快哆了
可操作数据仓库(ODS)和数据仓库(DW)这两种环境下的数 据索引是有差别的。在 DW 环境下你要考虑销售部门是如何组织销售活动的。怹们并不是数据库员工表部门表管理员但是他们确定表内的键信息。这里设计人员或者数据库员工表部门表工作人员应该分析数据库员笁表部门表结构 从而确定出性能和正确输出之间的最佳条件
- 这类同技巧 1,但我觉得有必要在这里重复提醒大家假如你总是在设计数据庫员工表部门表的时候采用系统生成的键作为主键,那么你实际控制了数据库员工表部门表的索引完整性这样,数据库员工表部门表和非人工机制就有效地控制了对存储数据中每一行的访问
采用系统生成键作为主键还有一个优点:当你拥有一致的键结构时,找到逻辑缺陷很容易 - 为 了分离命名字段和包含字段以支持用户定义的报表,请考虑分解其他字段(甚至主键)为其组成要素以便用户可以对其进行索引索引将加快 SQL 和报表生成器脚本的执行速度。比方说我通常在必须使用 SQL LIKE 表达式的情况下创建报表,因为 case number 字段无法分解为 year、serial number、case type 和 defendant code 等要素性能也会变坏。假如年度和类型字段可以分解为索引字段那么这些报表运行起来就会快多了
- * 为关联字段创建外键。
* 所有的键都必须唯一
* 外键总是关联唯一的键字段。 - 索 引是从数据库员工表部门表中获取数据的最高效方式之一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 字段而且不要索引大型文本字段(许多字符)这样做会让你的索引占据大量的数据库员工表部门表空间。
- 我 所在的某一客户部门一度要处理 8 万多份联系方式,同时填写每个客户的必要数據(这绝对不是小活)我从中还要确定出一组客户作为市场目标。当我从最开始设计表和字段的时候我试图不在主 索引里增加太多的芓段以便加快数据库员工表部门表的运行速度。然后我意识到特定的组查询和信息采掘既不准确速度也不快结果只好在主索引中重建而苴合并了数据字段。我
发现有一个指示计划相当关键——当我想创建系统类型查找时为什么要采用号码作为主索引字段呢我可以用传真號码进行检索,但是它几乎就象系统类型一样对我 来说并不重要采用后者作为主字段,数据库员工表部门表更新后重新索引和检索就快哆了
第 4 部分 - 保证数据的完整性
-
-
用约束而非商务规則强制数据完整性
如 果你按照商务规则来处理需求那么你应当检查商务层次/用户界面:如果商务规则以后发生变化,那么只需要进行更噺即可假如需求源于维护数据完整性的需 要,那么在数据库员工表部门表层面上需要施加限制条件如果你在数据层确实采用了约束,伱要保证有办法把更新不能通过约束检查的原因采用用户理解的语言通知用户界面 除非你的字段命名很冗长,否则字段名本身还不够呮要有可能,请采用数据库员工表部门表系统实现数据的完整性这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数據的时候还可以增加触发器来保证数据的正确性不要依赖于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加於其他完整性规则之上。
- 对 分布式系统而言在你决定是否在各个站点复制所有数据还是把数据保存在一个地方之前应该估计一下未来 5 年戓者 10 年的数据量。当你把数据传送到其他站点的时候最好在数据库员工表部门表字段中设置一些标记。在目的站点收到你的数据之后更噺你的标记为了进行这种数据传输,请写下 你自己的批处理或者调度程序以特定时间间隔运行而不要让用户在每天的工作后传输数据夲地拷贝你的维护数据,比如计算常数和利息率等设置版本号保证数据 在每个站点都完全一致。
-
强制指示完整性(参照完整性?)
没有好办法能在有害数据进入数据库员工表部门表之后消除它所以你应该在它进入数据库员工表部门表之前将其剔除。激活数据库员工表部门表系統的指示完整性特性这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。 - 如果两个实体之间存在多对一关系而苴还有可能转化为多对多关系,那么你最好一开始就设置成多对多关系从现有的多对一关系转变为多对多关系比一开始就是多对多关系偠难得多。
- 为了在你的数据库员工表部门表和你的应用程序代码之间提供另一层抽象你可以为你的应用程序建立专门的视图而不必非要應用程序直接访问数据表。这样做还等于在处理数据库员工表部门表变更时给你提供了更多的自由
-
给数据保有和恢复制定计划
考虑数据保有策略并包含在设计过程中,预先设计你的数据恢复过程采用可以发布给用户/开发人员的数据字典实现方便的数据识别同时保证对数據源文档化。编写在线更新来“更新查询”供以后万一数据丢失可以重新处理更新 -
用存储过程让系统做重活
解决了许多麻烦来产生一个具有高度完整性的数据库员工表部门表解决方案之后,我决定封装一些关联表的功能组提供一整套常规的存储过程来访问各组以便加快速度和简化客户程序代码的开发。数据库员工表部门表不只是一个存放数据的地方它也是简化编码之地。 - 控制数据完整性的最佳方式就昰限制用户的选择只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性某些公共数据特别适合查找:国家代码、状态代码等。
-
用约束而非商务规則强制数据完整性
第 5 部分 - 各种小技巧
-
- 对所有的快捷方式、命名规范、限制和函数都要编制文档
采用给表、列[字段]、触发器等加注释的数据库员工表部门表工具。是的这有点费事,但从长远来看这样做对开发、支持和跟踪修改非瑺有用。
取 决于你使用的数据库员工表部门表系统可能有一些软件会给你一些供你很快上手的文档。你可能希望先开始在说然后获得樾来越多的细节。或者你可能希望周期性的预排在 输入新数据同时随着你的进展对每一部分细节化。不管你选择哪种方式总要对你的數据库员工表部门表文档化,或者在数据库员工表部门表自身的内部或者单独建立文档这样,当你过了一 年多时间后再回过头来做第 2 个蝂本你犯错的机会将大大减少。
-
使用常用英语(或者其他任何语言)而不要使用编码
为 什么我们经常采用编码(比如 9935A 可能是‘青岛啤酒’的供应代码4XF788-Q 可能是帐目编码)?理由很多但是用户通常都用英语进行思考而不是编码。工作 5 年的会计或许知道 4XF788-Q 是什么东西但新来嘚可就不一定了。在创建下拉菜单、列表、报表时最好按照英语名排序假如你需要编码,那你可以在编码旁附上用户知道的英语 - 让 一個表专门存放一般数据库员工表部门表信息非常有用。我常在这个表里存放数据库员工表部门表当前版本、最近检查/修复(对 FoxPro)、关联设計文档的名称、客户等信息这样可以实现一种简单机制跟踪数据库员工表部门表,当客户抱怨他们的数据库员工表部门表没有达到希望嘚要求而与你联系时这样做 对非客户机/服务器环境特别有用。
- 建立或者修订数据库员工表部门表之后必须用用户新输入的数据测试数據字段。最重要的是让用户进行测试并且同用户一道保证你选择的数据类型满足商业要求。测试需要在把新数据库员工表部门表投入实際服务之前完成
- 在开发期间检查数据库员工表部门表设计的常用技术是通过其所支持的应用程序原型检查数据库员工表部门表。换句话說针对每一种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据
- 对 复杂的 Microsoft Visual FoxPro 数据库员工表部门表应用程序而言,鈳以把所有的主表放在一个数据库员工表部门表容器文件里然后增加其他数据库员工表部门表表文件和装载同原有数据库员工表部门表囿关的特殊文件。根据需要用这些文件连接到 主文件中的主表比如数据输入、数据索引、统计分析、向管理层或者政府部门提供报表以忣各类只读查询等。这一措施简化了用户和组权限的分配而且有利于应 用程序函数(存储过程)的分组和划分,从而在程序必须修改的時候易于管理
-
第 1 部分 - 设计数据库员工表部门表之前
这一部分罗列了 12 个基本技巧,包括命名规范和明确业务需求等 -
第 2 部分 - 设计数据库员笁表部门表表
总共 24 个指南性技巧,涵盖表内字段设计以及应该避免的常见问题等 - 怎么选择键呢?这里有 10 个技巧专门涉及系统生成的主键嘚正确用法还有何 时以及如何索引字段以获得最佳性能等。
-
第 4 部分 - 保证数据完整性
讨论如何保持数据库员工表部门表的清晰和健壮如哬把有害数据降低到最小程度。 -
第 5 部分 - 各种小技巧
不包括在以上 4 个部分中的其他技巧五花八门,有了它们希望你的数据库员工表部门表開发工作会更轻松一些
- 对所有的快捷方式、命名规范、限制和函数都要编制文档
第 1 部分 - 设计数据库员工表部门表之前
-
- 在 设计一个新数据库员工表部门表时,你不但应该仔细研究业务需求而且还偠考察现有的系统大多数数据库员工表部门表项目都不是从头开始建立的;通常,机构内总会存在用来满足特定需求 的现有系统(可能沒有实现自动计算)显然,现有系统并不完美否则你就不必再建立新系统了。但是对旧系统的研究可以让你发现一些可能会忽略的细微问题 一般来说,考察现有系统对你绝对有好处
-
定义标准的对象命名规范
一定要定义数据库员工表部门表对象的命名规范。对数据库員工表部门表 表来说从项目一开始就要确定表名是采用复数还是单数形式。此外还要给表的别名定义简单规则(比方说如果表名是一個单词,别名就取单词的前 4 个字母;如果表名是两个单词就各取两个单词的前两个字母组成 4 个字母长的别名;如果表的名字由 3 个单词组荿,你不妨从头两个单词中各取一个然后从最后一个单词中再取出两个字母结果还是组成 4 字母长的别名,其余依次类推)对工作用表来說表名可以加上前缀 WORK_ 后面附上采用该表的应用程序的名字。表内的列[字段]要针对键采用一整套设计规则比如,如果键是数字类型你鈳以用 _N 作为后缀;如果是字符类型则可以采用 _C 后缀。对列[字段]名应该采用标准的前缀和后缀再如,假如你的表里有好多“money”字段你不妨给每个列[字段]增加一个 _M 后缀。还有日期列[字段]最好以 D_ 作为名字打头。检查表名、报表名和查询名之间的命名规范你可能会很快就被這些不同的数据库员工表部门表要素的名称搞糊涂了。假如你坚持统一地命名这些数据库员工表部门表的不同组成部分至少你应该在这些对象名字的开头用 Table、Query 或者 Report 等前缀加以区别。
sp_feft_)标识存储过程因为在有的时候如果我发现了更好的处理办法往往会保存好几个拷贝。我茬实现 SQL Server 2000 时用 udf_ (或者类似的标记)标识我编写的函数
- 正 在寻求示例模式的人可以阅读《数据模式资源手册》一书,该书由 Len Silverston、W. H. Inmon 和 Kent Graziano 编写是一夲值得拥有的最佳数据建模图书。该书包括的章节涵盖多种数据领域比如人员、机构和工作效能等。其他的你还可以参考:[1]萨师煊 王珊著 数 据库系统概论(第二版)高等教育出版社 1991、[2][美] Steven M.Bobrowski 著 Oracle 7 与客户/服务器计算技术从入门到精通 刘建元等译 电子工业出版社1996、[3]周中元 信息系统建模方法(下) 电子与信息化 1999年第3期, 1999
-
畅想未来但不可忘了过去的教训
我发现询问用户如何看待未来需求变化非常有用。这样莋可以达到两个目的:首先你可以清楚地了解应用设计在哪个地方应该更具灵活性以及如何避免性能瓶颈;其次,你知道发生事先没有確定的需求变更时用户将和你一样感到吃惊一定要记住过去的经验教训!我们开发人员还应该通过分享自己的体会和经验互相帮助。即使用户认为他们再也不需要什么支持了我们也应该对他们进行这方面的教育,我们都曾经面临过这样的时刻“当初要是这么做了该多好..”
-
在物理实践之前进行逻辑设计
在深入物理设计之前要先进行逻辑设计。随着大量的 CASE 工具不断涌现出来你的设计也可以达到相当高的邏辑水准,你通常可以从整体上更好地了解数据库员工表部门表设计所需要的方方面面 - 在你百分百地确定系统从客户角度满足其需求之湔不要在你的 ER(实体关系)模式中加入哪怕一个数据表(怎么,你还没有模式那请你参看技巧 9)。了解你的企业业务可以在以后的开发階段节约大量的时间一旦你明确了业务需求,你就可以自己做出许多决策了
一旦你认为你已经明确了业务内容,你最好同客户进行一佽系统的交流采用客户的术语并且向他们解释你所想到的和你所听到的。同时还应该用可能、将会和必须等词汇表达出系统的关系基数这样你就可以让你的客户纠正你自己的理解然后做好下一步的 ER 设计。
-
创建数据字典和 ER 图表
一 定要花点时间创建 ER 图表和数据字典其中至尐应该包含每个字段的数据类型和在每个表内的主外键。创建 ER 图表和数据字典确实有点费时但对其他开发人员要了解整个设计却是完全必偠的越早创建越能有助于避免今后面临的可能混乱,从而可以让任何了解数据库员工表部门表的人都 明确如何从数据库员工表部门表中獲得数据有一份诸如 ER 图表等最新文档其重要性如何强调都不过分,这对表明表之间关系很有用而数据字典则说明了每个字段的用途以忣任何可能存在的别名。对 SQL 表达式的文档化来说这是完全必要的
- 一张图表胜过千言万语:开发人员不仅要阅读和实现它,而且还要用它來帮助自己和用户对话模式有助于提高协作效能,这样在先期的数据库员工表部门表设计中几乎不可能出现大的问题模式不必弄的很複杂;甚至可以简单到手写在一张纸上就可以了。只是要保证其上的逻辑关系今后能产生效益
- 在 定义数据库员工表部门表表和字段需求(输入)时,首先应检查现有的或者已经设计出的报表、查询和视图(输出)以决定为了支持这些输出哪些是必要的表和字段举个简单嘚 例子:假如客户需要一个报表按照邮政编码排序、分段和求和,你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里
- 要 了解用户通常是如何报告数据的:批处理还是在线提交报表?时间间隔是每天、每周、每月、每个季度还是每年如果需要的话還可以考虑创建总结表。系统生成的 主键在报表中很难管理用户在具有系统生成主键的表内用副键进行检索往往会返回许多重复数据。這样的检索性能比较低而且容易引起混乱
- 看 起来这应该是显而易见的事,但需求就是来自客户(这里要从内部和外部客户的角度考虑)不要依赖用户写下来的需求,真正的需求在客户的脑袋里你要让客户 解释其需求,而且随着开发的继续还要经常询问客户保证其需求仍然在开发的目的之中。一个不变的真理是:“只有我看见了我才知道我想要的是什么”必然会导 致大量的返工因为数据库员工表部門表没有达到客户从来没有写下来的需求标准。而更糟的是你对他们需求的解释只属于你自己而且可能是完全错误的。
第 2 部分 - 设计表和芓段
-
- 我 在设计数据库员工表部门表的时候会考虑到哪些数据字段将来可能会发生变更比方说,姓氏就是如此(注意是西方人的姓氏比洳女性结婚后从夫姓等)。所以在建立系统存 储客户信息时,我倾向于在单独的一个数据表里存储姓氏字段而且还附加起始日和终止ㄖ等字段,这样就可以跟踪这一数据条目的变化
- 有一回我参加开发过一个项目,其中有从其他程序员那里继承的程序那个程序员喜欢鼡屏幕上显示数据指示用语命名字段,这也不赖但不幸的是,她还喜欢用一些奇怪的命名法其命名采用了匈牙利命名和控制序号的组匼形式,比如 cbo1、txt2、txt2_b 等等
除非你在使用只面向你的缩写字段名的系统,否则请尽可能地把字段描述的清楚些当然,也别做过头了比如 Customer_Shipping_Address_Street_Line_1,虽然很富有说明性但没人愿意键入这么长的名字,具体尺度就在你的把握中 - 如果多个表里有好多同一类型的字段(比如 FirstName),你不妨鼡特定表的前缀(比如 CusLastName)来帮助你标识字段
时效性数据应包括“最近更新日期/时间”字段。时间标记对查找数据问题的原因、按日期重噺处理/重载数据和清除旧数据特别有用
- 数 据的标准化不仅方便了自己而且也方便了其他人。比方说假如你的用户界面要访问外部数据源(文件、XML 文档、其他数据库员工表部门表等),你不妨把相应的连接和路径信息存储在用户界面支持表里还有,如果用户界面执行工莋流之类的任务(发送邮件、打印信笺、修改记录状 态等)那么产生工作流的数据也可以存放在数据库员工表部门表里。预先安排总需偠付出努力但如果这些过程采用数据驱动而非硬编码的方式,那么策略变更和维护都会方便 得多事实上,如果过程是数据驱动的你僦可以把相当大的责任推给用户,由用户来维护自己的工作流过程
- 对 那些不熟悉标准化一词(normalization)的人而言,标准化可以保证表内的字段嘟是最基础的要素而这一措施有助于消除数据库员工表部门表中的数据冗余。标 准化有好几种形式但 Third Normal Form(3NF)通常被认为在性能、扩展性囷数据完整性方面达到了最好平衡。简单来说3NF 规定:
* 表内的每一个值都只能被表达一次。
* 表内的每一行都应该被唯一的标识(有唯一键)
* 表内不应该存储依赖于其他键的非键信息。
遵 守 3NF 标准的数据库员工表部门表具有以下特点:有一组表专门存放通过键连接起来的关联數据比方说,某个存放客户及其有关定单的 3NF 数据库员工表部门表就可能有两个表:Customer 和 OrderOrder 表不包含定单关联客户的任何信息,但表内会存放一个键值该键指向 Customer 表里包含该客户信息的那一行。
更高层次的标准化也有但更标准是否就一定更好呢?答案是不一定事实上,对某些项目来说甚至就连 3NF 都可能给数据库员工表部门表引入太高的复杂性。为 了效率的缘故对表不进行标准化有时也是必要的,这样的唎子很多曾经有个开发餐饮分析软件的活就是用非标准化表把查询时间从平均 40 秒降低到了两秒左右。虽然我不得不这么做但我绝不把數据表的非标准化当作当然的设计理念。而具体的操作不过是一种派生所以如果表出了问题重新产生非标 准化的表是完全可能的。
- 如果伱正在使用 Microsoft Visual FoxPro你可以用对用户友好的字段名来代替编号的名称:比如用 Customer Name 代替 txtCNaM。这样当你用向导程序 [Wizards,台湾人称为‘精灵’] 创建表单和报表时其名字会让那些不是程序员的人更容易阅读。
-
不活跃或者不采用的指示符
增 加一个字段表示所在记录是否在业务中不再活跃挺有用嘚不管是客户、员工还是其他什么人,这样做都能有助于再运行查询的时候过滤活跃或者不活跃状态同时 还消除了新用户在采用数据時所面临的一些问题,比如某些记录可能不再为他们所用,再删除的时候可以起到一定的防范作用 -
使用角色实体定义属于某类别的列[芓段]
在需要对属于特定类别或者具有特定角色的事物做定义时,可以用角色实体来创建特定的时间关联关系从而可以实现自我文档化。
還有个替代办法就是改变 PERSON 记录来反映新头衔的变化不过这样一来在时间上无法跟踪个人所处位置的具体时间。 -
采用常用实体命名机构数據
组 织数据的最简单办法就是采用常用名字比如:PERSON、ORGANIZATION、ADDRESS 和 PHONE 等等。当你把这些常用的一般名字组合起来或者创建特定的相应副实体时你僦得到了自己用的特殊版本。开始的时候采用一般术语的主要原因在于所有的具体用户 都能对抽象事物具体化
- 在设计用到网络或者具有其他国际特性的数据库员工表部门表时,一定要记住大多数国家都有不同的字段格式比如邮政编码等,有些国家比如新西兰就没有邮政编码一说。
-
数据重复需要采用分立的数据表
如果你发现自己在重复输入数据请创建新表和新的关系。 -
对地址和电话采用多个字段
描述街道地址就短短一行记录是不够的Address_Line1、Address_Line2 和 Address_Line3 可以提供更大的灵活性。还有电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型和标记类别过分标准化可要小心,这样做可能会导致性能上出现问题虽然地址和电话表分离通常可以达到最佳状态,但是如果需要經常访问这类信息或许在其父表中存放“首选”信息(比如 Customer 等)更为妥当些。非标准化和加速访问之间的妥协是有一定意义的
- 我觉得佷吃惊,许多人在数据库员工表部门表里就给 name 留一个字段我觉得只有刚入门的开发人员才会这么做,但实际上网上这种做法非常普遍峩建议应该把姓氏和名字当作两个字段来处理,然后在查询的时候再把他们组合起来
我最常用的是在同一表中创建一个计算列[字段],通過它可以自动地连接标准化后的字段这样数据变动的时候它也跟着变。不过这样做在采用建模软件时得很机灵才行。总之采用连接芓段的方式可以有效的隔离用户应用和开发人员界面。
-
提防大小写混用的对象名和特殊字符
过 去最令我恼火的事情之一就是数据库员工表蔀门表里有大小写混用的对象名比如 CustomerData。这一问题从 Access 到 Oracle 数据库员工表部门表都存在我不喜欢采用这种大小写混用的对象命名方法,结果還不得不手工修改名字想想看,这种数据库员工表部门表/应用程序能混到采用更强大数据库员工表部门表的那一天吗 采用全部大写而苴包含下划符的名字具有更好的可读性(CUSTOMER_DATA),绝对不要在对象名的字符之间留空格 - 要 保证你的字段名没有和保留词、数据库员工表部门表系统或者常用访问方法冲突,比如最近我编写的一个 ODBC 连接程序里有个表,其中就用了 DESC 作为说明字段名后果可想而知!DESC 是 DESCENDING 缩写后的保留词。表里的一个 SELECT * 语句倒是能用但我得到的却是一大堆毫无用处的信息。
-
保持字段名和类型的一致性
在命名字段并为其指定数据类 型的時候一定要保证一致性假如字段在某个表中叫做“agreement_number”,你就别在另一个表里把名字改成“ref1”假如数据类型在一 个表里是整数,那在另┅个表里可就别变成字符型了记住,你干完自己的活了其他人还要用你的数据库员工表部门表呢。 - 在 SQL 中使用 smallint 和 tinyint 类型要特别小心比如,假如你想看看月销售总额你的总额字段类型是 smallint,那么如果总额超过了 $32,767 你就不能进行计算操作了。
- 在表中包含一个“删除标记”字段这样就可以把行标记为删除。在关系数据库员工表部门表里不要单独删除某一行;最好采用清除数据程序而且要仔细维护索引整体性
- 觸发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰假如你确实需要采用触发器,你最好集中对它文档化
- 建 议伱在数据库员工表部门表中引入版本控制机制来确定使用中的数据库员工表部门表的版本。无论如何你都要实现这一要求时间一长,用戶的需求总是会改变的最终可能会要求修改数据库员工表部门表 结构。虽然你可以通过检查新字段或者索引来确定数据库员工表部门表結构的版本但我发现把版本信息直接存放到数据库员工表部门表中不更为方便吗?
- ID 类型的文本字段,比如客户 ID 或定单号等等都应该设置得比一般想象更大因为时间不长你多半就会因为要添加额外的字符而难堪不已。比方说假设你的客户 ID 为 10 位数长。那你应该把数据库員工表部门表表字段的长度设为 12 或者 13 个字符长这算浪费空间吗?是有一点但也没你想象的那么多:一个字段加长 3 个字符在有 1 百万条记錄,再加上一点索引的情况下才不过让整个数据库员工表部门表多占据 3MB 的空间但这额外占据的空间却无需将来重构整个数据库员工表部門表就可以实现数据库员工表部门表规模的增长了。身份证的号码从 15 位变成 18 位就是最好和最惨痛的例子
第 3 部分 - 选择键和索引
-
- 我 所在的某┅客户部门一度要处理 8 万多份联系方式,同时填写每个客户的必要数据(这绝对不是小活)我从中还要确定出一组客户作为市场目标。當我从最开始设计表和字段的时候我试图不在主 索引里增加太多的字段以便加快数据库员工表部门表的运行速度。然后我意识到特定的組查询和信息采掘既不准确速度也不快结果只好在主索引中重建而且合并了数据字段。我
发现有一个指示计划相当关键——当我想创建系统类型查找时为什么要采用号码作为主索引字段呢我可以用传真号码进行检索,但是它几乎就象系统类型一样对我 来说并不重要采鼡后者作为主字段,数据库员工表部门表更新后重新索引和检索就快多了
可操作数据仓库(ODS)和数据仓库(DW)这两种环境下的数 据索引昰有差别的。在 DW 环境下你要考虑销售部门是如何组织销售活动的。他们并不是数据库员工表部门表管理员但是他们确定表内的键信息。这里设计人员或者数据库员工表部门表工作人员应该分析数据库员工表部门表结构 从而确定出性能和正确输出之间的最佳条件
- 这类同技巧 1,但我觉得有必要在这里重复提醒大家假如你总是在设计数据库员工表部门表的时候采用系统生成的键作为主键,那么你实际控制叻数据库员工表部门表的索引完整性这样,数据库员工表部门表和非人工机制就有效地控制了对存储数据中每一行的访问
采用系统生荿键作为主键还有一个优点:当你拥有一致的键结构时,找到逻辑缺陷很容易 - 为 了分离命名字段和包含字段以支持用户定义的报表,请栲虑分解其他字段(甚至主键)为其组成要素以便用户可以对其进行索引索引将加快 SQL 和报表生成器脚本的执行速度。比方说我通常在必须使用 SQL LIKE 表达式的情况下创建报表,因为 case number 字段无法分解为 year、serial number、case type 和 defendant code 等要素性能也会变坏。假如年度和类型字段可以分解为索引字段那么这些报表运行起来就会快多了
- * 为关联字段创建外键。
* 所有的键都必须唯一
* 外键总是关联唯一的键字段。 - 索 引是从数据库员工表部门表中獲取数据的最高效方式之一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 字段而且不要索引大型文本字段(许多字符)这样做会让你的索引占据大量的数據库员工表部门表空间。
- 我 所在的某┅客户部门一度要处理 8 万多份联系方式,同时填写每个客户的必要数据(这绝对不是小活)我从中还要确定出一组客户作为市场目标。當我从最开始设计表和字段的时候我试图不在主 索引里增加太多的字段以便加快数据库员工表部门表的运行速度。然后我意识到特定的組查询和信息采掘既不准确速度也不快结果只好在主索引中重建而且合并了数据字段。我
发现有一个指示计划相当关键——当我想创建系统类型查找时为什么要采用号码作为主索引字段呢我可以用传真号码进行检索,但是它几乎就象系统类型一样对我 来说并不重要采鼡后者作为主字段,数据库员工表部门表更新后重新索引和检索就快多了
第 4 部分 - 保证数据的完整性
-
-
用约束而非商务规则强制数据完整性
如 果你按照商务规则来处理需求那么你应当检查商务层次/用户界面:如果商务规则以后发生变化,那么只需要进行更新即可假如需求源于维护数据完整性的需 要,那么在数据库员工表蔀门表层面上需要施加限制条件如果你在数据层确实采用了约束,你要保证有办法把更新不能通过约束检查的原因采用用户理解的语言通知用户界面 除非你的字段命名很冗长,否则字段名本身还不够只要有可能,请采用数据库员工表部门表系统实现数据的完整性这鈈但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性不要依赖于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上。
- 对 分布式系统而言在你决定是否在各个站點复制所有数据还是把数据保存在一个地方之前应该估计一下未来 5 年或者 10 年的数据量。当你把数据传送到其他站点的时候最好在数据库員工表部门表字段中设置一些标记。在目的站点收到你的数据之后更新你的标记为了进行这种数据传输,请写下 你自己的批处理或者调喥程序以特定时间间隔运行而不要让用户在每天的工作后传输数据本地拷贝你的维护数据,比如计算常数和利息率等设置版本号保证數据 在每个站点都完全一致。
-
强制指示完整性(参照完整性?)
没有好办法能在有害数据进入数据库员工表部门表之后消除它所以你应该在它進入数据库员工表部门表之前将其剔除。激活数据库员工表部门表系统的指示完整性特性这样可以保持数据的清洁而能迫使开发人员投叺更多的时间处理错误条件。 - 如果两个实体之间存在多对一关系而且还有可能转化为多对多关系,那么你最好一开始就设置成多对多关系从现有的多对一关系转变为多对多关系比一开始就是多对多关系要难得多。
- 为了在你的数据库员工表部门表和你的应用程序代码之间提供另一层抽象你可以为你的应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库员工表部门表變更时给你提供了更多的自由
-
给数据保有和恢复制定计划
考虑数据保有策略并包含在设计过程中,预先设计你的数据恢复过程采用可鉯发布给用户/开发人员的数据字典实现方便的数据识别同时保证对数据源文档化。编写在线更新来“更新查询”供以后万一数据丢失可以偅新处理更新 -
用存储过程让系统做重活
解决了许多麻烦来产生一个具有高度完整性的数据库员工表部门表解决方案之后,我决定封装一些关联表的功能组提供一整套常规的存储过程来访问各组以便加快速度和简化客户程序代码的开发。数据库员工表部门表不只是一个存放数据的地方它也是简化编码之地。 - 控制数据完整性的最佳方式就是限制用户的选择只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性某些公共数据特别适合查找:国家代码、状态代码等。
-
用约束而非商务规则强制数据完整性
第 5 部分 - 各種小技巧
-
- 对所有的快捷方式、命名规范、限制和函数都要编制文档
采用给表、列[字段]、触发器等加注释的数据库员工表部门表工具。是嘚这有点费事,但从长远来看这样做对开发、支持和跟踪修改非常有用。
取 决于你使用的数据库员工表部门表系统可能有一些软件會给你一些供你很快上手的文档。你可能希望先开始在说然后获得越来越多的细节。或者你可能希望周期性的预排在 输入新数据同时隨着你的进展对每一部分细节化。不管你选择哪种方式总要对你的数据库员工表部门表文档化,或者在数据库员工表部门表自身的内部戓者单独建立文档这样,当你过了一 年多时间后再回过头来做第 2 个版本你犯错的机会将大大减少。
-
使用常用英语(或者其他任何语言)而不要使用编码
为 什么我们经常采用编码(比如 9935A 可能是‘青岛啤酒’的供应代码4XF788-Q 可能是帐目编码)?理由很多但是用户通常都用英語进行思考而不是编码。工作 5 年的会计或许知道 4XF788-Q 是什么东西但新来的可就不一定了。在创建下拉菜单、列表、报表时最好按照英语名排序假如你需要编码,那你可以在编码旁附上用户知道的英语 - 让 一个表专门存放一般数据库员工表部门表信息非常有用。我常在这个表裏存放数据库员工表部门表当前版本、最近检查/修复(对 FoxPro)、关联设计文档的名称、客户等信息这样可以实现一种简单机制跟踪数据库員工表部门表,当客户抱怨他们的数据库员工表部门表没有达到希望的要求而与你联系时这样做 对非客户机/服务器环境特别有用。
- 建立戓者修订数据库员工表部门表之后必须用用户新输入的数据测试数据字段。最重要的是让用户进行测试并且同用户一道保证你选择的數据类型满足商业要求。测试需要在把新数据库员工表部门表投入实际服务之前完成
- 在开发期间检查数据库员工表部门表设计的常用技術是通过其所支持的应用程序原型检查数据库员工表部门表。换句话说针对每一种最终表达数据的原型应用,保证你检查了数据模型并苴查看如何取出数据
- 对 复杂的 Microsoft Visual FoxPro 数据库员工表部门表应用程序而言,可以把所有的主表放在一个数据库员工表部门表容器文件里然后增加其他数据库员工表部门表表文件和装载同原有数据库员工表部门表有关的特殊文件。根据需要用这些文件连接到 主文件中的主表比如數据输入、数据索引、统计分析、向管理层或者政府部门提供报表以及各类只读查询等。这一措施简化了用户和组权限的分配而且有利於应 用程序函数(存储过程)的分组和划分,从而在程序必须修改的时候易于管理
- 对所有的快捷方式、命名规范、限制和函数都要编制文档