`
yupengcc
  • 浏览: 138908 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

数据库设计中应注意的问题

阅读更多

内容来源:

http://blog.sina.com.cn/s/blog_4a607ed601000agu.html

 

引言数据库设计是信息系统设计的基础,一个好的数据库设计在满足了软件需求之外,还要易维护、易扩充等等要求。当然,对专家们反复强调的数据的一致性、冗余性、访问效率等问题的解决,很大程度上取决于数据库设计者的经验和专业水平。但这不妨碍我们根据过去的经验,从实用的角度给出数据库设计所要要考虑的问题并尽可能给出相应的解决方案,从而给信息系统的数据库设计者一些有益的启示。(注:这里的数据库设计主要指数据库中表和视图的schema设计,不涉足数据库系统中其他方面的设计)那么怎样才算是一个好的数据库设计呢?以下给出一个一般性的标准。

一、一个好的数据库设计首先要满足用户的需求
所有信息系统最后都将提交给最终用户使用,对于这一点,相信大家都已经达成共识。但是准确地把握用户的需求是很难的,虽然
各方面的专家已经从不同方面给出了解决方案,但是用户需求仍然是软件工程中最不确定的因素之一。

二、一个好的数据库设计要便于维护和扩充
为了应对用户需求的修改和添加,也为了满足各种不同的软硬件环境下系统的使用,大部分信息系统都不得不在其生命期中进行升
级和调整。在这些升级、调整中,又有相当部分会涉及到数据库设计的修改,因此,数据库设计最好从一开始就能在易维护、可扩充的角度多加斟酌。

1、不要为各种编号字段的设定固定的意义
而是最好通过对照表来建立这种编号和意义的对照关系。举例来说,很多设计者习惯给部门信息给出固定的编号,这种设计有个致
命的缺陷:那就是由于这种对照关系既然不体现在数据库中,就必然要用业务逻辑来进行解释,这样一来,一有新的调整就不得不更新业务逻辑代码,也就非常容易不一致的错误。

2、枚举信息要体现在相应在对照表中
而不是体现在使用该信息的表中的值字段,这样做的好处是当用户希望用该枚举信息作为查询条件的时候,通过参照表的方式可以
很容易的建立这些信息,另外也避免了当多个表格中都含有该枚举信息有可能引起的不一致。

3、用关联表建立表和表之间的多对多关系
而不要用一个字段解析的方式进行,举例来说,为了描述用户(UserInfo)和角色(RoleInfo)之间的关联关系,我们要建立对照表
UserInfo_RoleInfo,而不要试图在用户表中建立一个较长的字段,如Roles(用RoleID1; RoleID2...的形式构成)来代替,因为这样一来字段解释需要在业务代码相应的解析代码,二来由于Roles定长,无法满足用户角色的扩充。

三、一个好的数据库设计要具有“可读性”
如同编程书籍中反复强调的程序员一定要在代码的可读性方面下功夫一样,考虑到信息系统将来的升级和维护可能要要由另外一批
人来进行,因此数据库设计必然也要具有可理解性。对此,我们参照提高代码可读性的常用方法,给出一些建议:

1、用设计文档来提高数据库设计的可读性
这点基本对应于“可读性”代码里面的注释。在一个合格的数据库设计文档中必须给出数据库中的每个表、每个字段、表间的关联
关系以及各种约束的意义以及由来,从而有可能让开发者根据用户需求和设计文档就能理解正确数据库的设计。

2、给表和视图起一个有意义的名字
这点对应于coding规范中的变量和函数的命名,很显然,CustomerInfo的名字很容易联想到该表中含有客户信息,而把它命名为
Table0001只能让人感到费解外。另外,如果DBMS提供表和视图名的大小写支持,该名称最好由每个构成单词(首字母大写)拼接而成。

3、用前缀给出表和视图内容之外的其他信息
如给参照表Ref_前缀,这样就可以让业务逻辑实现人员根据表的名字知道他所要操作的是不是张参照表,从而帮助他更快地理解详
细设计,并有可能及早发现里面的错误。同样,给所有视图加上V_前缀,就可以让业务逻辑编程者很容易地知道他现在面临的是一个表还是视图,从而避免了对视图进行更新操作这种低级的错误。

4、给每一个字段起一个有意义的名字
如给CustomerInfo表中的电子邮件字段起名EMail让人很容易明白它的准确含义,而Field05则让人不知所云。基于同样的道理,数
据库设计中也不能给字段起一个张冠李戴的名字。

5、字段命名要考虑上下文
举例来说,在UserInfo表中,用UserName来表示用户名字段就不如Name来的更加合适。这种情况画蛇添足的情况在对照表的设计中
体现得尤为明显,如把部门对照表(Ref_Department)中的部门ID字段命名为DepartmentID,把部门名称字段命名为DepartmentName等等。

6、视图的设计不要牵扯到其他视图
与代码设计中函数调用最好不要嵌套过多层次相对应,为了便于数据库设计的阅读人能够很好地理解设计,视图最好直接建立在表
上。

7、同一表中的记录最好不要相互引用
这种引用关系不仅让数据库设计的阅读人云里雾里,也不便于业务逻辑代码的编写。

8、关联表的命名用关联的表名中间加下划线连接构成
如学生(StudentInfo)和课程(CourseInfo)的关联表起名StudentInfo_CourseInfo。

四、一个好的数据库设计能够满足空间和效率的要求
对于一个信息系统来说,在实现用户需求的基础之上,保证一个较低的空间占用以及短的响应时间都是理智的客户所愿意看到的。
那么在这一方面,数据库设计又要做些什么工作呢?

1、使用varchar而不要使用char字段
对于不定长信息如用户的简介信息,varchar的使用可以减少近一半的空间占用。当然这点不能一概而论,如用相应长度的char存储
定长文本数据就比varchar来的合适。

2、不要使用BLOB字段存放“大数据”
BLOB字段诚如其名,本身是为存储二进制大数据而出现的,同样的道理也适用于某些DBMS所引入的TEXT字段。因为对于一般信息系
统而言,最长的字段往往是一些描述文本信息,而DBMS对char/varchar的长度基本能满足这种需求。因此积极建议设计者对一些貌似很长的文本的最大允许长度进行确认,在此基础上参照DBMS中的开发手册来决定是否采用大字段。

3、不要使用设计器缺省的字段长度
这种做法一方面纵容了设计者对用户需求的一知半解以及对设计敷衍了事的不良习惯,另外一方面也在数据的存储上浪费了不少的
空间,因为使用缺省字段长度的情况往往发生在字段上。

4、不要轻易使用unicode文本字段
DBMS对unicode的支持在帮助产品国际化的同时,也在一定程度上带来空间上的浪费,尤其是在当要存储的文本中的基本都是ASCII
字符的情况下,这种浪费尤为明显。因此,建议设计者在选择unicode的理由,一定是出于国际化的考虑,而不是其他。因为大多数的大字符集和ASCII字符并存情况下所要碰到的问题基本上都已经由DBMS提供商解决。

5、使用预计算表来提高响应速度
跟数据仓库里面的某些思路相似,当业务逻辑中需要用倒根据历史信息得来的统计数据时,最好由独立于系统的预计算模块或相应
的DW工具定期完成这些统计数据的预计算。

五、一个好的数据库设计可以简化业务逻辑的设计
所有的数据库设计都不是孤立的,它通过相应的业务逻辑实现(三层结构中还有表现层)来形成最终的产品,因此一个好的数据库
设计应该能够帮助降低业务逻辑的编写难度,最起码不要给业务逻辑的设计、编码带来额外工作。

1、所有允许为空的字段必须是基于用户需求,而不是出于设计上方便的考虑。这样带来的好处是让详细设计中的某些错误和疏漏(如在设计中没有考虑对非空字段的内容检查)在编码和单元测试阶段就被发现,从而避免了进一步扩散,有助于提高软件的质量。

2、不要业务逻辑代码实现唯一性约束
对数据库表中的某些字段(或者多个字段的组合)的唯一性约束应该尽可能地加到数据库端。因为这种约束工作交给业务逻辑中去
实现代价高昂而且不可靠。

3、关联约束一定要建立在数据库端
分析出设计中所涉及的主外键引用关系并体现在数据库设计中。这一条出于两点考虑:降低业务逻辑的编写难度和数据关联性约束
的要求。

分享到:
评论

相关推荐

    数据库设计中值得注意的问题

    以下是对“数据库设计中值得注意的问题”的详细解析。 1. **概念设计**:首先,我们需要进行概念设计,将业务需求转化为实体关系模型(ER模型)。在这个阶段,要确保实体的定义准确,属性全面,关系明确。避免过度...

    软件开发,数据库设计注意事项

    ### 软件开发中的数据库设计注意事项 #### 数据库设计注意事项概述 数据库设计注意事项是许多IT专业人士在长期的数据库分析与设计实践中逐步总结出来的宝贵经验。对于这些经验的应用,我们不能生搬硬套、死记硬背...

    4-软件数据库设计文档模板.docx

    本文档中,我们将详细介绍数据库设计的每一个方面,并提供相应的设计要点和注意事项。 数据库逻辑设计 数据库逻辑设计是数据库设计的第一步骤,涉及到数据库的概念模型、逻辑模型和物理模型的设计。在逻辑设计阶段...

    模板-数据库设计说明书.doc

    在编写数据库设计说明书时,需要注意以下几点: 1. Database设计说明书需要清晰、准确、完整,确保数据库的设计和实现符合项目的需求和要求。 2. 数据库设计说明书需要遵守一定的格式和结构,确保数据库设计的...

    数据库设计开发规范-阿里.pdf.zip

    数据库设计还应注意安全性,包括权限管理、访问控制和审计。通过角色(Role-based Access Control, RBAC)和策略来限制用户对数据库的访问,避免数据泄露。同时,应实施数据加密策略,保护敏感信息。 在开发阶段,...

    数据库设计总结(设计方法,设计技巧)

    数据库设计是信息系统开发过程中的关键环节,它直接影响到系统的性能、可扩展性和数据一致性。本文将深入探讨数据库设计的方法和技巧,旨在为开发者提供实用的指导。 首先,我们需要理解数据库设计的基本概念。...

    使用PowerDesigner进行数据库设计

    ### 使用PowerDesigner进行数据库设计详解 #### 一、PowerDesigner简介 PowerDesigner是一款强大的数据库建模工具,由SAP公司开发。它可以帮助开发者快速高效地完成数据库的设计与维护工作,支持概念模型、逻辑模型...

    设计数据库(表结构设计)

    设计优化是数据库设计不可或缺的环节。检查是否遗漏了字段,主关键字是否合适,是否存在重复信息,以及表的设计是否合理。如果发现字段过多而记录较少,或者有很多字段值为空,可能需要重新设计表结构,以减少字段,...

    ORACLE数据库设计与优化

    2. 触发器:自动执行特定任务,但应谨慎使用,过度依赖触发器可能导致性能问题。 六、数据库性能监控与调优 1. 使用Oracle Enterprise Manager (OEM):进行实时性能监控,识别性能瓶颈。 2. 分析与调整执行计划:...

    数据库设计--ER图

    ### 数据库设计——ER图详解 #### 一、数据库设计概述 数据库设计是一个系统化的过程,旨在构建一个高效且能够满足特定应用环境需求的数据库。它不仅涉及数据的有效存储,还包括确保数据的安全性和完整性。数据库...

    数据库设计经验谈 数据库设计经验 数据库设计经验总结谈

    设计过程中应避免常见的错误,例如过度规范化导致的数据冗余或反规范化带来的数据一致性问题。合理平衡这两者之间的关系是至关重要的。 #### 三、选择键 **3.1 如何选择键** 选择合适的键对于确保数据的完整性和...

    SQL数据库设计基础

    本文将详细介绍SQL数据库设计的基础过程,以及在每个阶段应采取的方法和注意事项。 首先,数据库设计始于需求分析阶段。这一阶段的目的是清晰地理解用户的需求,包括用户的工作流程、业务逻辑以及数据处理方式。...

    数据库设计经验.pdf

    在现代信息技术领域中,数据库设计是构建高效稳定的信息管理系统的核心环节之一。一个优秀的数据库不仅能够有效地存储和管理数据,还能提高系统的整体性能与稳定性。因此,掌握良好的数据库设计原则与实践方法对于...

    数据库课程设计---某中学的排课管理系统的设计

    本课程分为系统分析、数据库设计两个阶段进行。应用程序设计作为选做内容。 数据库系统课程设计的主要目标是: a)加深对数据库系统、程序设计语言的理论知识的理解并提高应用水平。 b)通过实践,掌握数据库设计...

    8个数据库设计典型实例

    在数据库设计实践中,应当注意的一些关键点包括: 1. 数据库规范化:规范化是一种减少数据冗余和提高数据一致性的技术。根据范式理论,可以将数据表划分为第一范式(1NF)、第二范式(2NF)、第三范式(3NF)等更...

    数据库 设计 说明 实例

    ### 数据库设计说明实例知识...以上是对“数据库设计说明实例”中的主要内容进行了详细的解析和总结。通过对这些内容的学习,可以更好地理解如何进行数据库设计,特别是在学分制教务管理系统这类复杂系统的设计过程中。

    数据库系统设计全面介绍

    ### 数据库设计中的注意事项 - **需求分析**:深入了解用户需求,预测未来变化,保持沟通,确保设计目标与用户期望一致。 - **业务理解**:熟悉企业的业务流程,有助于设计更贴合实际需求的数据库结构。 - **输入...

    数据库设计实践总结.docx

    数据库设计实践总结 ...我们需要注意数据库设计的优劣和表达性能,避免使用 varmax 类型,使用预留字段等问题,并且需要团队合作和遇到困难永不放弃。只有这样,我们才能提高数据库的性能和可靠性,取得成功。

    数据库设计规范word文档

    本文档将总结数据库设计规范的主要内容,包括数据库编码规范、字段设计规定、试图设计规则、索引设计规则、数据库命名规则、表和表字段的命名规则、视图名规则、存储过程名规则、命名注意事项和 QSL 语句的编写规范...

Global site tag (gtag.js) - Google Analytics