2. 概念l构设计阶段
通过对用户需求进行综合、归U与抽象QŞ成一个独立于具体DBMS的概忉|型,可以用E-R图表C?br />
概念模型用于信息世界的徏模。概忉|型不依赖于某一个DBMS支持的数据模型。概忉|型可以{换ؓ计算Z某一DBMS支持的特定数据模型?br />
概念模型特点Q?br />
(1) h较强的语义表达能力,能够方便、直接地表达应用中的各种语义知识?br />
(2) 应该单、清晰、易于用L解,是用户与数据库设计h员之间进行交的语言?br />
概念模型设计的一U常用方法ؓIDEF1XҎQ它是把实?联系Ҏ应用到语义数据模型中的一U语义模型化技术,用于建立pȝ信息模型?br />
使用IDEF1XҎ创徏E-R模型的步骤如下所C?
2.1 W零?-初始化工E?br />
q个阶段的Q务是从目的描q和范围描述开始,定建模目标Q开发徏模计划,l织建模队伍Q收集源材料Q制定约束和规范。收集源材料是这阶段的重炏V通过调查和观察结果,业务程Q原有系l的输入输出Q各U报表,攉原始数据QŞ成了基本数据资料表?br />
2.2 W一?-定义实体
实体集成员都有一个共同的特征和属性集Q可以从攉的源材料--基本数据资料表中直接或间接标识出大部分实体。根据源材料名字表中表示物的术语以及h"代码"l尾的术语,如客户代码、代理商代码、品代码等其名词部分代表的实体标识出来,从而初步找出潜在的实体QŞ成初步实体表?br />
2.3 W二?-定义联系
IDEF1X模型中只允许二元联系Qn元联pdd义ؓn个二元联pR根据实际的业务需求和规则Q用实体联pȝ阉|标识实体间的二元关系Q然后根据实际情늡定出q接关系的势、关pd和说明,定关系cdQ是标识关系、非标识关系Q强制的或可选的Q还是非定关系、分cdpR如果子实体的每个实例都需要通过和父实体的关pL标识Q则为标识关p,否则为非标识关系。非标识关系中,如果每个子实体的实例都与而且只与一个父实体兌Q则为强制的Q否则ؓ非强制的。如果父实体与子实体代表的是同一现实对象Q那么它们ؓ分类关系?br />
2.4 W三?-定义?br />
通过引入交叉实体除去上一阶段产生的非定关系Q然后从非交叉实体和独立实体开始标识侯选码属性,以便唯一识别每个实体的实例,再从侯选码中确定主码。ؓ了确定主码和关系的有效性,通过非空规则和非多D则来保证Q即一个实体实例的一个属性不能是I|也不能在同一个时L一个以上的倹{找认的定关系Q将实体q一步分解,最后构造出IDEF1X模型的键图(KB图)?br />
2.5 W四?-定义属?br />
从源数据表中抽取说明性的名词开发出属性表Q确定属性的所有者。定义非ȝ属性,查属性的非空及非多D则。此外,q要查完全依赖函数规则和非传递依赖规则,保证一个非ȝ属性必M赖于ȝ、整个主码、仅仅是ȝ。以此得C臛_W合关系理论W三范式的改q的IDEF1X模型的全属性视图?br />
2.6 W五?-定义其他对象和规?br />
定义属性的数据cd、主键、长度、精度、非I、缺省倹{约束规则等。定义触发器、存储过E、视图、角艌Ӏ同义词、序列等对象信息?/p>
3. 逻辑l构设计阶段
概늻构{换ؓ某个DBMS所支持的数据模型(例如关系模型Q,q对其进行优化。设计逻辑l构应该选择最适于描述与表辄应概늻构的数据模型Q然后选择最合适的DBMS?br />
E-R图{换ؓ关系模型实际上就是要实体、实体的属性和实体之间的联p{化ؓ关系模式,q种转换一般遵循如下原则:
1Q一个实体型转换Z个关pL式。实体的属性就是关pȝ属性。实体的码就是关pȝ码?br />
2Q一个m:n联系转换Z个关pL式。与该联pȝq的各实体的码以及联pLw的属性均转换为关pȝ属性。而关pȝ码ؓ各实体码的组合?br />
3Q一?:n联系可以转换Z个独立的关系模式Q也可以与n端对应的关系模式合ƈ。如果{换ؓ一个独立的关系模式Q则与该联系相连的各实体的码以及联系本n的属性均转换为关pȝ属性,而关pȝ码ؓn端实体的码?br />
4Q一?:1联系可以转换Z个独立的关系模式Q也可以与Q意一端对应的关系模式合ƈ?br />
5Q三个或三个以上实体间的一个多元联p{换ؓ一个关pL式。与该多元联pȝq的各实体的码以及联pLw的属性均转换为关pȝ属性。而关pȝ码ؓ各实体码的组合?br />
6Q同一实体集的实体间的联系Q即自联p,也可按上q?:1?:n和m:n三种情况分别处理?br />
7Q具有相同码的关pL式可合ƈ?br />
Zq一步提高数据库应用pȝ的性能Q通常以规范化理论为指|q应该适当C攏V调整数据模型的l构Q这是数据模型的优化。确定数据依赖。消除冗余的联系。确定各关系模式分别属于W几范式。确定是否要对它们进行合q或分解。一般来说将关系分解?NF的标准,卻I
表内的每一个值都只能被表达一ơ?br />
表内的每一行都应该被唯一的标识(有唯一键)?br />
表内不应该存储依赖于其他键的非键信息?/p>
4. 数据库物理设计阶D?br /> 为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储l构和存取方法)。根据DBMS特点和处理的需要,q行物理存储安排Q设计烦引,形成数据库内模式?/p>
5. 数据库实施阶D?br /> q用DBMS提供的数据语aQ例如SQLQ及其宿主语aQ例如CQ,Ҏ逻辑设计和物理设计的l果建立数据库,~制与调试应用程序,l织数据入库Qƈq行试运行。数据库实施主要包括以下工作Q用DDL定义数据库结构、组l数据入库、编制与调试应用E序、数据库试运?/p>
6. 数据库运行和l护阶段
数据库应用系l经q试q行后即可投入正式运行。在数据库系l运行过E中必须不断地对其进行评仗调整与修改。包括:数据库的转储和恢复、数据库的安全性、完整性控制、数据库性能的监督、分析和改进、数据库的重l织和重构造?/p>
建模工具的?br /> 为加快数据库设计速度Q目前有很多数据库辅助工PCASE工具Q,如Rational公司的Rational RoseQCA公司的Erwin和BpwinQSybase公司的PowerDesigner以及Oracle公司的Oracle Designer{?br /> ERwin主要用来建立数据库的概念模型和物理模型。它能用囑Ş化的方式Q描q出实体、联pd实体的属性。ERwin支持IDEF1XҎ。通过使用ERwin建模工具自动生成、更改和分析IDEF1X模型Q不仅能得到优秀的业务功能和数据需求模型,而且可以实现从IDEF1X模型到数据库物理设计的{变。ERwin工具l制的模型对应于逻辑模型和物理模型两U。在逻辑模型中,IDEF1X工具可以方便地用图形化的方式构建和l制实体联系及实体的属性。在物理模型中,ERwin可以定义对应的表、列Qƈ可针对各U数据库理pȝ自动转换为适当的类型?br /> 设计人员可根据需要选用相应的数据库设计建模工具。例如需求分析完成之后,设计人员可以使用Erwin画ER图,ER图{换ؓ关系数据模型Q生成数据库l构Q画数据图Q生成应用程序?/p>
二、数据库设计技?br />
1. 设计数据库之前(需求分析阶D)
1) 理解客户需求,询问用户如何看待未来需求变化。让客户解释光求,而且随着开发的l箋Q还要经常询问客户保证其需求仍然在开发的目的之中?br />
2) 了解企业业务可以在以后的开发阶D节U大量的旉?br />
3) 重视输入输出?br />
在定义数据库表和字段需求(输入Q时Q首先应查现有的或者已l设计出的报表、查询和视图Q输出)以决定ؓ了支持这些输出哪些是必要的表和字Dc?br />
举例Q假如客户需要一个报表按照邮政编码排序、分D和求和Q你要保证其中包括了单独的邮政编码字D而不要把邮政~码p进地址字段里?br />
4) 创徏数据字典和ER 图表
ER 图表和数据字典可以让M了解数据库的人都明确如何从数据库中获得数据。ER囑֯表明表之间关pd有用Q而数据字典则说明了每个字D늚用途以及Q何可能存在的别名。对SQL 表达式的文档化来说这是完全必要的?br />
5) 定义标准的对象命名规?br />
数据库各U对象的命名必须规范?/p>
2. 表和字段的设计(数据库逻辑设计Q?br />
表设计原?br />
1) 标准化和规范?br />
数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式Q但Third Normal FormQ?NFQ通常被认为在性能、扩展性和数据完整性方面达C最好^衡。简单来_遵守3NF 标准的数据库的表设计原则是:"One Fact in One Place"x个表只包括其本n基本的属性,当不是它们本w所h的属性时需q行分解。表之间的关p通过外键相连接。它h以下特点Q有一l表专门存放通过键连接v来的兌数据?br />
举例Q某个存攑֮户及其有兛_单的3NF 数据库就可能有两个表QCustomer 和Order。Order 表不包含定单兌客户的Q何信息,但表内会存放一个键|该键指向Customer 表里包含该客户信息的那一行?br />
事实上,Z效率的缘故,对表不进行标准化有时也是必要的?br />
2) 数据驱动
采用数据驱动而非编码的方式Q许多策略变更和l护都会方便得多Q大大增强系l的灉|性和扩展性?br />
举例Q假如用L面要讉K外部数据源(文g、XML 文、其他数据库{)Q不妨把相应的连接和路径信息存储在用L面支持表里。还有,如果用户界面执行工作之cȝdQ发送邮件、打CW、修改记录状态等Q,那么产生工作的数据也可以存攑֜数据库里。角色权限管理也可以通过数据驱动来完成。事实上Q如果过E是数据驱动的,你就可以把相当大的责Ll用Pqhl护自己的工作流q程?br />
3) 考虑各种变化
在设计数据库的时候考虑到哪些数据字D将来可能会发生变更?br />
举例Q姓氏就是如此(注意是西方h的姓氏,比如x结婚后从夫姓等Q。所以,在徏立系l存储客户信息时Q在单独的一个数据表里存储姓氏字D,而且q附加v始日和终止日{字D,q样可以跟t这一数据条目的变化。字D设计原?br />
1) 每个表中都应该添加的3 个有用的字段
o?dRecordCreationDateQ在VB 下默认是Now()Q而在SQL Server 下默认ؓGETDATE()
o?sRecordCreatorQ在SQL Server 下默认ؓNOT NULL DEFAULT USER
o?nRecordVersionQ记录的版本标记Q有助于准确说明记录中出现null 数据或者丢失数据的原因
2) 对地址和电话采用多个字D?br />
描述街道地址q短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵zL。还有,电话L和邮件地址最好拥有自q数据表,光h自n的类型和标记cd?br />
3) 使用角色实体定义属于某类别的?br />
在需要对属于特定cd或者具有特定角色的事物做定义时Q可以用角色实体来创建特定的旉兌关系Q从而可以实现自我文化?br />
举例Q用PERSON 实体和PERSON_TYPE 实体来描qCh员。比方说Q当John Smith, Engineer 提升为John Smith, Director 乃至最后爬到John Smith, CIO 的高位,而所有你要做的不q是改变两个表PERSON 和PERSON_TYPE 之间关系的键|同时增加一个日?旉字段来知道变化是何时发生的。这P你的PERSON_TYPE 表就包含了所有PERSON 的可能类型,比如Associate、Engineer、Director、CIO 或者CEO {。还有个替代办法是改变PERSON 记录来反映新头衔的变化,不过q样一来在旉上无法跟t个人所处位|的具体旉?br />
4) 选择数字cd和文本类型尽量充?br />
在SQL 中用smallint 和tinyint cd要特别小心。比如,假如想看看月销售总额Q总额字段cd是smallintQ那么,如果总额过?32,767 ׃能进行计操作了?br />
而ID cd的文本字D,比如客户ID 或定单号{等都应该设|得比一般想象更大。假讑֮户ID ?0 位数ѝ那你应该把数据库表字段的长度设?2 或?3 个字W长。但q额外占据的I间却无需来重构整个数据库就可以实现数据库规模的增长了?br />
5) 增加删除标记字段
在表中包含一?删除标记"字段Q这样就可以把行标记为删除。在关系数据库里不要单独删除某一行;最好采用清除数据程序而且要仔l维护烦引整体性?/p>
3. 选择键和索引Q数据库逻辑设计Q?br />
键选择原则Q?br />
1) 键设? 原则
o?为关联字D创建外键?br />
o?所有的键都必须唯一?br />
o?避免使用复合键?br />
o?外键L兌唯一的键字段?br />
2) 使用pȝ生成的主?br />
设计数据库的时候采用系l生成的键作Z键,那么实际控制了数据库的烦引完整性。这P数据库和非h工机制就有效地控制了对存储数据中每一行的讉K。采用系l生成键作ؓ主键q有一个优点:当拥有一致的键结构时Q找到逻辑~陷很容易?br />
3) 不要用用L?不让主键h可更新?
在确定采用什么字D作的键的时候,可一定要心用户要~辑的字Dc通常的情况下不要选择用户可编辑的字段作ؓ键?br />
4) 可选键有时可做主键
把可选键q一步用做主键,可以拥有建立强大索引的能力?/p>
索引使用原则Q?br />
索引是从数据库中获取数据的最高效方式之一?5%的数据库性能问题都可以采用烦引技术得到解冟?br />
1) 逻辑主键使用唯一的成l烦引,对系l键Q作为存储过E)采用唯一的非成组索引Q对M外键列采用非成组索引。考虑数据库的I间有多大,表如何进行访问,q有q些讉K是否主要用作d?br />
2) 大多数数据库都烦引自动创建的主键字段Q但是可别忘了烦引外键,它们也是l常使用的键Q比如运行查询显CZ表和所有关联表的某条记录就用得上?br />
3) 不要索引memo/note 字段Q不要烦引大型字D(有很多字W)Q这样作会让索引占用太多的存储空间?br />
4) 不要索引常用的小型表
不要为小型数据表讄M键,假如它们l常有插入和删除操作更别这样作了。对q些插入和删除操作的索引l护可能比扫描表I间消耗更多的旉?4. 数据完整性设计(数据库逻辑设计Q?br />
1) 完整性实现机Ӟ
实体完整性:主键
参照完整性:
父表中删除数据:U联删除Q受限删除;|空?br />
父表中插入数据:受限插入Q递归插入
父表中更新数据:U联更新Q受限更斎ͼ|空?br />
DBMS对参照完整性可以有两种Ҏ实现Q外键实现机ӞU束规则Q和触发器实现机?br />
用户定义完整性:
NOT NULLQCHECKQ触发器
2) 用约束而非商务规则强制数据完整?br />
采用数据库系l实现数据的完整性。这不但包括通过标准化实现的完整性而且q包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正性。不要依赖于商务层保证数据完整性;它不能保证表之间Q外键)的完整性所以不能强加于其他完整性规则之上?br />
3) 强制指示完整?br />
在有x据进入数据库之前其剔除。激zL据库pȝ的指C完整性特性。这样可以保持数据的清洁而能q开发h员投入更多的旉处理错误条g?br />
4) 使用查找控制数据完整?br />
控制数据完整性的最x式就是限制用L选择。只要有可能都应该提供给用户一个清晰的价值列表供光择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找Q国家代码、状态代码等?br />
5) 采用视图
Z在数据库和应用程序代码之间提供另一层抽象,可以为应用程序徏立专门的视图而不必非要应用程序直接访问数据表。这样做q等于在处理数据库变更时l你提供了更多的自由?/p>
5Q?导入/导出声称数据库或数据表操作注意事?br /> 不同的数据库pȝ或者相同的数据库系l之间允总导入/导出的方法来在另一个不同的数据库中形成新的数据库或者数据库中的表,q是一个十分简z的ҎQ但是需要注意的是,q样的操作会源表中的一些信息丢失,如关键字、默认值等Q所以在执行完导?导出的操作之后,一定要在目的数据库中重新检查设|相兛_性?/p>
6. 其他设计技?br />
1) 避免使用触发?br />
触发器的功能通常可以用其他方式实现。在调试E序时触发器可能成ؓq扰。假如你实需要采用触发器Q你最好集中对它文化?br />
2) 使用常用pQ或者其他Q何语aQ而不要用编?br />
在创Z拉菜单、列表、报表时最好按照英语名排序。假如需要编码,可以在编码旁附上用户知道的英语?br />
3) 保存常用信息
让一个表专门存放一般数据库信息非常有用。在q个表里存放数据库当前版本、最q检?修复Q对AccessQ、关联设计文档的名称、客L信息。这样可以实CU简单机制跟t数据库Q当客户抱怨他们的数据库没有达到希望的要求而与你联pLQ这样做寚w客户?服务器环境特别有用?br />
4) 包含版本机制
在数据库中引入版本控制机制来定使用中的数据库的版本。时间一长,用户的需求L会改变的。最l可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方ѝ?br />
5) ~制文
Ҏ有的快捷方式、命名规范、限制和函数都要~制文?br />
采用l表、列、触发器{加注释的数据库工具。对开发、支持和跟踪修改非常有用?br />
Ҏ据库文化,或者在数据库自w的内部或者单独徏立文档。这P当过了一q多旉后再回过头来做第2 个版本,犯错的机会将大大减少?br />
6) 试、测试、反复测?br />
建立或者修订数据库之后Q必ȝ用户新输入的数据试数据字段。最重要的是Q让用户q行试q且同用户一道保证选择的数据类型满_业要求。测试需要在把新数据库投入实际服务之前完成?br />
7) 查设?br />
在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话_针对每一U最l表达数据的原型应用Q保证你查了数据模型q且查看如何取出数据?/p>
三、数据库命名规范
语言--一般来说定义数据库时不要用中文或其他cd文字的字D名Q尽量用英文或者英文或英文加数字来作ؓ字段名,管使用中文或其他类型文字作为字D名在直接操作数据库时很ҎQ但是在数据库以及依赖于数据库的前台E序的不同语a操作pȝ的兼Ҏ完全失,当然中文或其他类型文字可以放在字D늚描述或者说明里面v辅助作用?br />
明确--原则上字D名的定义只要符合数据库pȝ的字D定义要求就可以Q如Q???#8230;…QA、B、C?#8230;…QABC、A12BC?#8230;…Q等都是合法字段Q但是一定的数据库往往是和一定的前台E序联系h的,如果字段名定义不明确Q造成E序在编写过E中的乱,E序的可L、可l护性差?br />
准确--字段名尽量用准的英文名字Q如果相同名字的字段有几个,可以用字母或者数字后~区别。不要用系l的保留字作为字D名。字D名可以按照大小写敏感的方式来命名?br />
z?-避免使用不必要的前缀Q如有一个Contact?联系?表,其中有一个联pMh名字的字D,不要使用ContactName作ؓ其字D名Q用Name可以了?br />
序--按照描述事物或者常规思维模式来安排顺序,不要随意安排序Q虽然Q意顺序的字段都可以,但是对于数据库的l护来说却非帔R烦,特别是字D多的表?/p>
1. 实体Q表Q的命名
1) 表以名词或名词短语命名,定表名是采用复数还是单数Ş式,此外一些数据库pȝ允许l标定义别名Q给表的别名定义单规则(比方_如果表名是一个单词,别名取单词的前4个字母;如果表名是两个单词,各取两个单词的前两个字母组?个字母长的别名;如果表的名字?个单词组成,从头两个单词中各取一个然后从最后一个单词中再取Z个字母,l果q是l成4 字母长的别名Q其余依ơ类推)对于不同功能的表来说Q表名可以加上适当的前~后面附上采用该表的名字。在命名q程当中Q以明确的名字命名会l应用程序的~写带来极大的方ѝ?br />
举例Q?br />
定义的羃?Sales: Sal 销售;
Order: Ord 订单Q?br />
Detail: Dtl 明细Q?br />
则销售订单明l表命名为:Sal_Ord_Dtl;
2) 无论表或者是字段的名UC有一个单词或者没有,量不要使用~写Q而是用完整的单词或者单词加数字l合?br />
举例Q?br />
定义的羃?Material 物品Q?br />
物品表名为:Material;
但是字段物品~码则用QCode; 名称用:Name;
3) 兌c通过用下划线q接两个基本cM后,再加前缀R的方式命?后面按照字母序|列两个表名或者表名的~写?br />
兌表用于保存多对多关系?br />
如果被关联的表名大于10个字母,必须原来的表名的进行羃写。如果没有其他原因,都用羃写?br />
举例Q表Object与自w存在多对多的关p?则保存多对多关系的表命名为:R_ObjectQ?br />
?Depart和Employee;存在多对多的关系Q则兌表命名ؓR_Dept_Emp
2. 属性(列)的命?br />
1) 采用有意义的列名Q表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作ؓd,逻辑上的d作ؓW一l候选主健来定义,如果是数据库自动生成的编码,l一命名为:ID;如果是自定义的逻辑上的~码则用~写?ID"的方法命名。如果键是数字类型,你可以用_NO 作ؓ后缀Q如果是字符cd则可以采用_CODE 后缀。对列名应该采用标准的前~和后~?br />
举例Q销售订单的~号字段命名QSal_Ord_IDQ如果还存在一个数据库生成的自动编P则命名ؓQID?br />
2) 所有的属性加上有关类型的后缀Q注意,如果q需要其它的后缀Q都攑֜cd后缀之前?br />
? 数据cd是文本的字段Q类型后~TX可以不写。有些类型比较明昄字段Q可以不写类型后~?br />
3) 采用前缀命名
l每个表的列名都采用l一的前~Q那么在~写SQL表达式的时候会得到大大的简化。这样做也确实有~点Q比如破坏了自动表连接工L作用Q后者把公共列名同某些数据库联系h?/p>
3. 视图的命?br /> 1) 视图以V作ؓ前缀Q其他命名规则和表的命名cMQ?br /> 2) 命名应尽量体现各视图的功能?/p>
4. 触发器的命名
触发器以TR作ؓ前缀Q触发器名ؓ相应的表名加上后~QInsert触发器加'_I'QDelete触发器加'_D'QUpdate触发器加'_U'Q如QTR_Customer_IQTR_Customer_DQTR_Customer_U?/p>
5. 存储q程?br /> 存储q程应以'UP_'开_和系l的存储q程区分Q后l部分主要以动宾形式构成Qƈ用下划线分割各个l成部分。如增加代理商的帐户的存储过Eؓ'UP_Ins_Agent_Account'?/p>
6. 变量?br /> 变量名采用小写,若属于词lŞ式,用下划线分隔每个单词Q如@my_err_no?/p>
7. 命名中其他注意事?br /> 1) 以上命名都不得超q?0个字W的pȝ限制。变量名的长度限制ؓ29Q不包括标识字符@Q?br /> 2) 数据对象、变量的命名都采用英文字W,止使用中文命名。绝对不要在对象名的字符之间留空根{?br /> 3) 心保留词,要保证你的字D名没有和保留词、数据库pȝ或者常用访问方法冲H?br /> 4) 保持字段名和cd的一致性,在命名字Dƈ为其指定数据cd的时候一定要保证一致性。假如数据类型在一个表里是整数Q那在另一个表里可别变成字符型了