»
S
I
D
E
B
A
R
«
数据库设计指南:::::
Oct 30th, 2004 by 一米六二

如果把企业的数据比做生命所必需的血液,那么数据库的设计就是应用中最重要的一部分。有关数据库设计的材料汗牛充栋,大学学位课程里也有专门的讲述。不过,就如我们反复强调的那样,再好的老师也比不过经验的教诲。所以我最近找了些对数据库设计颇有造诣的专业人士给大家传授一些设计数据库的技巧和经验。我从收到的130 个反馈中精选了其中的60 个最佳技巧,并把这些技巧编写成了本文,为了方便索引其内容划分为5 个部分:

第1 部分— 设计数据库之前
这一部分罗列了12 个基本技巧,包括命名规范和明确业务需求等。
第2 部分— 设计数据库表
总共24 个指南性技巧,涵盖表内字段设计以及应该避免的常见问题等。
第3 部分— 选择键
怎么选择键呢?这里有10 个技巧专门涉及系统生成的主键的正确用法,还有何时以及如何索引字段以获得最佳性能等。
第4 部分— 保证数据完整性
讨论如何保持数据库的清晰和健壮,如何把有害数据降低到最小程度。
第5 部分— 各种小技巧
不包括在以上4 个部分中的其他技巧,五花八门,有了它们希望你的数据库开发工作会更轻松一些。

——————————————————————————–

第1 部分— 设计数据库之前

1. 考察现有环境
在设计一个新数据库时,你不但应该仔细研究业务需求而且还要考察现有的系统。大多数数据库项目都不是从头开始建立的;通常,机构内总会存在用来满足特定需求的现有系统(可能没有实现自动计算)。显然,现有系统并不完美,否则你就不必再建立新系统了。但是对旧系统的研究可以让你发现一些可能会忽略的细微问题。一般来说,考察现有系统对你绝对有好处。

我曾经接手过一个为地区运输公司开发的数据库项目,活不难,用的是Access 数据库。我设置了一些项目设计参数,而且同客户一道对这些参数进行了评估,事先还查看了开发环境下所采取的工作模式,等到最后部署应用的时候,只见终端上出了几个提示符然后立马在我面前翘辫子了!抓耳挠腮的折腾了好几个小时,我才意识到,原来这家公司的网络上跑着两个数据库应用,而对网络的访问需要明确和严格的用户帐号及其访问权限。明白了这一点,问题迎刃而解:只需采用客户的系统即可。这个项目给我的教训就是:记住,假如你在诸如Access 或者Interbase 这类公共环境下开发应用程序,一定要从表面下手深入系统内部搞清楚你面临的环境到底是怎么回事。

2. 定义标准的对象命名规范
一定要定义数据库对象的命名规范。对数据库表来说,从项目一开始就要确定表名是采用复数还是单数形式。此外还要给表的别名定义简单规则(比方说,如果表名是一个单词,别名就取单词的前4 个字母;如果表名是两个单词,就各取两个单词的前两个字母组成4 个字母长的别名;如果表的名字由3 个单词组成,你不妨从头两个单词中各取一个然后从最后一个单词中再取出两个字母,结果还是组成4 字母长的别名,其余依次类推)对工作用表来说,表名可以加上前缀WORK_ 后面附上采用该表的应用程序的名字。表内的列要针对键采用一整套设计规则。比如,如果键是数字类型,你可以用_NO 作为后缀;如果是字符类型则可以采用_CODE 后缀。对列名应该采用标准的前缀和后缀。再如,假如你的表里有好多“money”字段,你不妨给每个列增加一个_AMT 后缀。还有,日期列最好以DATE_作为名字打头。

检查表名、报表名和查询名之间的命名规范。你可能会很快就被这些不同的数据库要素的名称搞糊涂了。假如你坚持统一地命名这些数据库的不同组成部分,至少你应该在这些对象名字的开头用table、query 或者report 等前缀加以区别。

如果采用了Microsoft Access,你可以用qry、rpt、tbl 和mod 等符号来标识对象(比如
tbl_Employees)。我在和SQL Server(或者Oracle)打交道的时候还用过tbl 来索引表,但我用sp_company (现在用sp_feft_)标识存储过程,因为在有的时候如果我发现了更好的处理办法往往会保存好几个拷贝。我在实现SQL Server 2000 时用udf_ (或者类似的标记)标识我编写的函数。

3. 预先计划
上个世纪80 年代初,我还在使用资产帐目系统和System 38 平台,那时我负责设计所有的日期字段,这样在不费什么力气的情况下将来就可以轻松处理2000 年问题了。许多人给我说就别去解决这一问题了,因为要处理起来太麻烦了(这在世人皆知的Y2K 问题之前很久了)。我回击说只要预先计划今后就不会遇到大麻烦。结果我只用了两周的时间就把程序全部改完了。因为预先计划的好,后来Y2K 问题对该系统的危害降到了最低程度(最近听说该程序甚至到了1995 年都还运行在AS/400 系统上,唯一出现的小问题是从代码中删除注释费了点工夫)。

4. 获取数据模式资源手册
正在寻求示例模式的人可以阅读《数据模式资源手册》一书,该书由Len Silverston、W. H.Inmon 和Kent Graziano 编写,是一本值得拥有的最佳数据建模图书。该书包括的章节涵盖多种数据领域,比如人员、机构和工作效能等。

5. 畅想未来,但不可忘了过去的教训
我发现询问用户如何看待未来需求变化非常有用。这样做可以达到两个目的:首先,你可以清楚地了解应用设计在哪个地方应该更具灵活性以及如何避免性能瓶颈;其次,你知道发生事先没有确定的需求变更时用户将和你一样感到吃惊。

一定要记住过去的经验教训!我们开发人员还应该通过分享自己的体会和经验互相帮助。即使用户认为他们再也不需要什么支持了,我们也应该对他们进行这方面的教育,我们都曾经面临过这样的时刻“当初要是这么做了该多好⋯⋯”。

6. 在物理实践之前进行逻辑设计
在深入物理设计之前要先进行逻辑设计。随着大量的CASE 工具不断涌现出来,你的设计也可以达到相当高的逻辑水准,你通常可以从整体上更好地了解数据库设计所需要的方方面面。

7. 了解你的业务
在你百分百地确定系统从客户角度满足其需求之前不要在你的ER(实体关系)模式中加入哪怕一个数据表(怎么,你还没有模式?那请你参看技巧9)。了解你的企业业务可以在以后的开发阶段节约大量的时间。一旦你明确了业务需求,你就可以自己做出许多决策了。

一旦你认为你已经明确了业务内容,你最好同客户进行一次系统的交流。采用客户的术语并且向他们解释你所想到的和你所听到的。同时还应该用可能、将会和必须等词汇表达出系统的关系基数。这样你就可以让你的客户纠正你自己的理解然后做好下一步的ER 设计。

8. 创建数据字典和ER 图表
一定要花点时间创建ER 图表和数据字典。其中至少应该包含每个字段的数据类型和在每个表内的主外键。创建ER 图表和数据字典确实有点费时但对其他开发人员要了解整个设计却是完全必要的。越早创建越能有助于避免今后面临的可能混乱,从而可以让任何了解数据库的人都明确如何从数据库中获得数据。

有一份诸如ER 图表等最新文档其重要性如何强调都不过分,这对表明表之间关系很有用,而数据字典则说明了每个字段的用途以及任何可能存在的别名。对SQL 表达式的文档化来说这是完全必要的。

9. 创建模式
一张图表胜过千言万语:开发人员不仅要阅读和实现它,而且还要用它来帮助自己和用户对话。模式有助于提高协作效能,这样在先期的数据库设计中几乎不可能出现大的问题。模式不必弄的很复杂;甚至可以简单到手写在一张纸上就可以了。只是要保证其上的逻辑关系今后能产生效益。

10. 从输入输出下手
在定义数据库表和字段需求(输入)时,首先应检查现有的或者已经设计出的报表、查询和视图(输出)以决定为了支持这些输出哪些是必要的表和字段。举个简单的例子:假如客户需要一个报表按照邮政编码排序、分段和求和,你要保证其中包括了单独的邮政编码字段而不要把邮政编码糅进地址字段里。

11. 报表技巧
要了解用户通常是如何报告数据的:批处理还是在线提交报表?时间间隔是每天、每周、每月、每个季度还是每年?如果需要的话还可以考虑创建总结表。系统生成的主键在报表中很难管理。用户在具有系统生成主键的表内用副键进行检索往往会返回许多重复数据。这样的检索性能比较低而且容易引起混乱。

12. 理解客户需求
看起来这应该是显而易见的事,但需求就是来自客户(这里要从内部和外部客户的角度考虑)。不要依赖用户写下来的需求,真正的需求在客户的脑袋里。你要让客户解释其需求,而且随着开发的继续,还要经常询问客户保证其需求仍然在开发的目的之中。一个不变的真理是:“只有我看见了我才知道我想要的是什么”必然会导致大量的返工,因为数据库没有达到客户从来没有写下来的需求标准。而更糟的是你对他们需求的解释只属于你自己,而且可能是完全错误的。
——————————————————————————–

第2 部分— 设计表和字段

1. 检查各种变化
我在设计数据库的时候会考虑到哪些数据字段将来可能会发生变更。比方说,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫

heh我的模板被引用了,第一次哦
Oct 25th, 2004 by 一米六二

标题:heh我的模板被引用了,第一次哦::::::::AddDate: 登录

——————————————————————————–
引言:

hoo  第一次跟老外的软件站在了一块儿 … 很自豪的说…

——————————————————————————–
正文 :

引用地址:

http://www.blueidea.com/bbs/newsdetail.asp?id=1794133

txtdb2.0的新功能
Oct 20th, 2004 by 一米六二

1.能够实现其它数据库的功能:比如创建,删除,修改数据库(表)

,查询记录(2.0版本的查询中使用了快速查找),修改记录,删除记录等等功能。
用access可以完成的网站,用txtdb也可以完成.

2.2.0版本比1.0相比,增加了如下功能:

数据表数据存储类型可以选择为巨型表和微型表(所谓巨型和微型是针对单个记
录而言。)巨型表的每一个记录都存储在一个单独的文件中,微型表所有的数据都存
储在一个数据文件中.

数据查询中,增加了”不等于“这一比较方式。

数据查询为fastsearch引擎.(或者称作二分法查询)

数据列自动判断是否为数字类型。(目前数据字段的类型主要为字符串和数字两
种。没有自动增长数字类型或者双精度,单精度等等数据类型.这一问题将在下一版
本里解决.)

2.0修改的bug:

修改了当仅仅有一个记录的时候,删除这个记录后系统给出的当前行数目不是”
0″ 而是””的bug.

AspTxtDb ver2.0 函数列表之三
Oct 17th, 2004 by 一米六二

这些是管理必须用的哦.

createDb(databaseName) databasename 是数据库名字.

Createtable(tablename,Colstr) 建立table.colstr是用逗号分隔的列名

crteateindex(indexStr) indexstr是用逗号分隔的列名.创建索引用.

dropIndex(indexStr) indexstr是用逗号分隔的列名.用来删除索引

droptable(tablename) 删除表

dropdb(dbname)删除数据库

checkname(name) 检察列名,表名,数据库名是否合法.

AspTxtDb ver 2.0 策划(2):::::
Oct 17th, 2004 by 一米六二

取回结果:

fetchRow(res) res是query函数返回的结果.返回数据库的一行记录.

fetchCol(colId,res) ColId 是列Id,res是fetchRow函数返回的结果.也可以用fetchCol(colName,row),ColName 是列的名字.返回某一行的某一列的数值.

Rows() 返回的是当前表的行数,

row(id)返回的是第id个记录的记录行.

Getrows(res)res是query返回的结果.返回的是当前结果集的行数.

getCols() 返回一个数据表的列的数目.

Col(id,row) id是列id,row是返回的一个数据记录行.

colName(colid) colid是列的id,返回列名称.

偶今天测试了下webEditor的功能,确实不错哦。
Oct 12th, 2004 by 一米六二

偶今天测试了下webEditor的功能,确实不错哦。
简直呆了啊,哈哈,超级强啊,看来javascript也不容小视力啊。偶都佩服的不得了啦 

看来学什么东西都要非常精,这样做什么都有前途啊。

主页做出来了,asptxtdb的几个bug也被发现了.
Oct 11th, 2004 by 一米六二

在做主页的时候,发现asptxtdb的几个错误,马上去改正了。

感觉用自己做的数据驱动就是,虽然可能出些问题,但是毕竟是自己做的,哪怕是累一点,还是感觉特别温馨。

希望这个主页做出来了后能够更受人欢迎!

自己做的blog系统也加进取了,下一步是要做一个备份系统,这样能够虽然把数据下载下来,而且也可以虽然导入到数据库里。

在白云发表的 用 borland c++ build ,做成isapi
Oct 11th, 2004 by 一米六二

用 borland c++ build ,做成isapi 偶懂一点点 不过 如果要我做的话  做一个
留言本页也要一个月  而且薪水要求估计也没有人能承受 
所以如果不是有特别要求的话 建议不要用C++啦。你可以尝试做一下:
打开Borland c++ builder,建立一个project,选择web application (名字大概差不多是这个,我机器上没有装,安装比较麻烦 ),E文好的话 知道是选择web类应用的就行了,然后有四个选项,代表了isapi的不同的工作方式 ,不用管他,就选择默认的即可(或者你改一下试试看)
然后建立工程,在属性的actions 里新建一个action,然后随便在Path里随便填一个名字(要求最初好是英文字母组成 估计填错了系统会提示的) 然后给他的html属性写上一段 HTML,然后编译.
将得到的dll文件拷贝到iis的虚拟目录中,给这个目录赋以执行权限,然后在浏览器输入类这样的路径 http://localhost/dll/myfirst.dll/path
dll 是iis的有执行权限的虚拟目录
myfirst.dll 是dll文件的名字
path是前面path的属性。
一个action都有一个path属性的,不写path属性只有dll的路径是无法执行的
一个dll文件基本上就相当于一个网站,每一个action都相当于你asp网站中的一个asp文件.
好了暂时写这么多
已经很久没有做这个了
难度比较大 资料比较难找 国内做这个的也不多,个人感觉也没有什么必要.文章只是凭记忆写的,可能很多错误,比如那些属性的名字,我晚上装一个borland C++ 了验证一下 再来修改

今天丁辉住院了,白云的rxiao 给主页提了意见.
Oct 11th, 2004 by 一米六二

看到他痛苦的样子 我也特难受,我很努力的帮他,我在想,如果我们大家 象这样在外面都不互相帮助的话,那会是个什么样子?
看到他痛苦的样子 我也特难受,我很努力的帮他,我在想,如果我们大家象这样在外面都不互相帮助的话,那会是个什么样子?
白云上的帖子,rxiao回了,很认真的提了些意见(真的感谢这个热心的斑竹) 我很快的改正了,并打算以最快的速度再做一个功能更强的,并提供下载.努力使大家认识asp template,Asp txtdb 这些东西。突然觉得自己做asp的底层次的开发已经很成型了,现在缺少的是系统整合的能力。我很喜欢现在的asp template,觉得非常实用。如果哪个网站让我用 asp template 去重构,我一定非常乐意,哪怕是免费去做,我很希望能够推广自己的研究成果,希望自己的东西能够有价值,能够物有所用.

收到asp版的n友的建议
Oct 11th, 2004 by 一米六二

看到他痛苦的样子 我也特难受,我很努力的帮他,我在想,如果我们大家 象这样在外面都不互相帮助的话,那会是个什么样子?

      白云上的帖子,rxiao回了,很认真的提了些意见(真的感谢这个热心的斑竹) 我很快的改正了,并打算以最快的速度再做一个功能更强的,并提供下载.努力使大家认识asp template,Asp txtdb 这些东西。突然觉得自己做asp的底层次的开发已经很成型了,现在缺少的是系统整合的能力。我很喜欢现在的asp template,觉得非常实用。如果哪个网站让我用 asp template 去重构,我一定非常乐意,哪怕是免费去做,我很希望能够推广自己的研究成果,希望自己的东西能够有价值,能够物有所用.

»  Substance: WordPress   »  Style: Ahren Ahimsa
29479 页面访问次数, 561 今天
11361 访问数, 178 今天
FireStats icon 由FireStats提供支持