如何数据库设计

数据库设计
数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库,使之能够有效地存储数据,满足各种用户的应用需求(信息要求和处理要求)。

一、数据库设计的步骤
1
.考察现有环境
在设计一个新数据库时,应该仔细研究业务需求,考察现有的系统。大多数数据库项目都不是从头开始建立的;通常,机构内会存在用来满足特定需求的现有系统。显然,现有系统并不完美,否则你就不必再建立新系统了。但是对旧系统的研究可以让你发现一些可能会忽略的细微问题。
2
.定义标准的对象命名规范
一定要定义数据库对象的命名规范。对数据库表来说,从项目一开始就要确定表名是采用何种命名方式。此外还要给表的别名定义简单规则(比方说,如果表名是一个单词,别名就取单词的前 4 个字母;如果表名是两个单词,就各取两个单词的前两个字母组成 4 个字母长的别名;如果表的名字由 3 个单词组成,不妨从头两个单词中各取一个然后从最后一个单词中再取出两个字母,结果还是组成 4 字母长的别名,其余依次类推)对工作用表来说,表名可以加上前缀 WORK_ 后面附上采用该表的应用程序的名字。表内的列[字段]要针对键采用一整套设计规则。比如,如果键是数字类型,你可以用 _N 作为后缀;如果是字符类型则可以采用 _C 后缀。对列[字段]名应该采用标准的前缀和后缀。再如,假如表里有好多“money”字段,可以给每个列[字段]增加一个 _M 后缀。还有,日期列[字段]可以以 D_ 作为名字打头。

3.
选择理想的数据库设计工具
比如:SyBase 公司的 PowerDesign,她支持 PBVBDelphe java等语言,通过 ODBC 可以连接市面上流行的 30 多个数据库,包括 dBaseFoxProVFPSQL Server oracle
4.
需求分析
在确定系统从客户角度满足其需求之前不要在 ER(实体关系)模式中加入任何数据表。了解企业业务可以在以后的开发阶段节约大量的时间。明确了业务内容,最好同客户进行一次系统的交流。这样可以让客户纠正一些不正确的理解然后做好下一步的 ER 设计。
5
.创建数据字典和 ER 图表
创建 ER 图表和数据字典。其中至少应该包含每个字段的数据类型和在每个表内的主外键。创建 ER 图表和数据字典可以让任何了解数据库的人都明确如何从数据库中获得数据。有一份诸如 ER 图表等最新文档对表明表之间关系很有用,而数据字典则说明了每个字段的用途以及任何可能存在的别名。
6
.逻辑结构设计
将创建的ER图转换为某个DBMS所支持的数据模型,对其进行优化
7
.数据库物理设计
为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)
8
.数据库实施
运用DBMS提供的数据语言、工具及宿主语言,根据逻辑设计和物理设计的结果
  建立数据库,编制与调试应用程序,组织数据入库,并进行试运行
二、数据库设计技巧
  1. 设计数据库之前(需求分析阶段)
  1) 理解客户需求,询问用户如何看待未来需求变化。让客户解释其需求,一个不变的真理是只有我看见了我才知道我想要的是什么,随着开发的继续,要经常询问客户,保证其需求仍然在开发的目的之中。
  2) 了解企业业务可以在以后的开发阶段节约大量的时间。
  3) 定义标准的对象命名规范
  数据库各种对象的命名必须规范。
  2. 表和字段的设计(数据库逻辑设计)
  表设计原则
  1) 标准化和规范化
  数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式,但Third Normal Form3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说,遵守3NF 标准的数据库的表设计原则是:“One Fact in One Place”即某个表只包括其本身基本的属性,当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。
  
  2) 数据驱动
  采用数据驱动而非硬编码的方式,许多策略变更和维护都会方便得多,大大增强系统的灵活性和扩展性。
  举例,假如用户界面要访问外部数据源(文件、XML 文档、其他数据库等),不妨把相应的连接和路径信息存储在用户界面支持表里。还有,如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上,如果过程是数据驱动的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。
  3) 考虑各种变化
  在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。
  举例,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫姓等)。所以,在建立系统存储客户信息时,在单独的一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化。

  字段设计原则
  1) 每个表中都应该添加的3 个有用的字段
dRecordCreateDate
,记录创建日期,可以对该字段附上默认值
sRecordCreator
,记录创建者
nRecordVersion
,记录的版本标记;有助于准确说明记录中出现null 数据或者丢失数据的原因   
  2) 对地址和电话采用多个字段
  描述街道地址就短短一行记录是不够的。Address_Line1Address_Line2 Address_Line3 可以提供更大的灵活性。还有,电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型和标记类别。
  3) 选择数字类型和文本类型尽量充足
  在SQL 中使用smallint tinyint 类型要特别小心。比如,假如想看看月销售总额,总额字段类型是smallint,那么,如果总额超过了$32,767 就不能进行计算操作了。
  而ID 类型的文本字段,比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。
  4) 增加删除标记字段
  在表中包含一个删除标记字段,这样就可以把行标记为删除。在关系数据库里不要单独删除某一行;最好采用清除数据程序而且要仔细维护索引整体性。
  5) 保持字段名和类型的一致性
    
在命名字段并为其指定数据类型的时候一定要保证一致性。假如字段在某个表中叫做“agreement_number”,你就别在另一个表里把名字改成“ref1”。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。

3.
选择键和索引
  键选择原则:
  1) 键设计4 原则
        
为关联字段创建外键。
        
所有的键都必须唯一。
        
避免使用复合键。
        
外键总是关联唯一的键字段。
  2) 使用系统生成的主键
  设计数据库的时候采用系统生成的键作为主键,那么实际控制了数据库的索引完整性。这样,数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点:当拥有一致的键结构时,找到逻辑缺陷很容易。
  3) 不要用用户的键(不让主键具有可更新性)
  在确定采用什么字段作为表的键的时候,可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。
  4) 可选键有时可做主键
  把可选键进一步用做主键,可以拥有建立强大索引的能力。
    5)
分解字段用于索引
    
为了分离命名字段和包含字段以支持用户定义的报表,请考虑分解其他字段(甚至主键)为其组成要素以便用户可以对其进行索引。索引将加快 SQL 和报表生成器脚本的执行速度。比方说,我通常在必须使用 SQL LIKE 表达式的情况下创建报表,因为 case number 字段无法分解为 yearserial numbercase type defendant code 等要素。性能也会变坏。假如年度和类型字段可以分解为索引字段那么这些报表运行起来就会快多了
    
索引使用原则:
  索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。
  1) 逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列采用非成组索引。考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写。
  2) 大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,比如运行查询显示主表和所有关联表的某条记录就用得上。
  3) 不要索引memo/note 字段,不要索引大型字段(有很多字符),这样作会让索引占用太多的存储空间。
  4) 不要索引常用的小型表
  不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。
    5
)不要把社会保障号码(SSN)或身份证号码(ID)选作键
    
不要使用 SSN ID 作为数据库的键。SSN ID 需要手工输入。最好不要使用手工输入的键作为主键,因为一旦输入错误,必段删除整个记录然后从头开始
  4. 数据完整性设计(数据库逻辑设计)
  1) 完整性实现机制:
  实体完整性:主键
  参照完整性:
  父表中删除数据:级联删除;受限删除;置空值
  父表中插入数据:受限插入;递归插入
  父表中更新数据:级联更新;受限更新;置空值
  DBMS对参照完整性可以有两种方法实现:外键实现机制(约束规则)和触发器实现机制
  用户定义完整性:
  NOT NULLCHECK;触发器
  2) 用约束而非商务规则强制数据完整性
  采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上。
  3) 强制指示完整性
  在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。
  4) 使用查找控制数据完整性
  控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找:国家代码、状态代码等。
  5) 采用视图
  为了在数据库和应用程序代码之间提供另一层抽象,可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。
  5. 其他设计技巧
  1) 避免使用触发器
  触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。
  2) 使用常用英语(或者其他任何语言)而不要使用编码
  在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码,可以在编码旁附上用户知道的英语。
  3) 保存常用信息
  让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复(对Access)、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库,当客户抱怨他们的数据库没有达到希望的要求而与你联系时,这样做对非客户机/服务器环境特别有用。
  4) 包含版本机制
  在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长,用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。
  5) 编制文档
  对所有的快捷方式、命名规范、限制和函数都要编制文档。
  采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。
  对数据库文档化,或者在数据库自身的内部或者单独建立文档。这样,当过了一年多时间后再回过头来做第2 个版本,犯错的机会将大大减少。
  6) 测试、测试、反复测试
  建立或者修订数据库之后,必须用用户新输入的数据测试数据字段。最重要的是,让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。
  7) 检查设计
  在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说,针对每一种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据。\

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值