写给开发者看的关系型数据库设计

来源:互联网 发布:数据挖掘 韩家炜 ppt 编辑:程序博客网 时间:2024/06/04 19:51
数据库设计,一个软件项目成功的基石。很多从业人员都认为,数据库设计其实不那么重要。现实中的情景也相当雷同,开发人员的数量是数据库设计人员的数倍。多数人使用数据库中的一部分,所以也会把数据库设计想的如此简单。其实不然,数据库设计也是门学问。


  从笔者的经历看来,笔者更赞成在项目早期由开发者进行数据库设计(后期调优需要DBA)。根据笔者的项目经验,一个精通OOP和ORM的开发者,设计的数据库往往更为合理,更能适应需求的变化,如果追其原因,笔者个人猜测是因为数据库的规范化,与OO的部分思想雷同(如内聚)。而DBA,设计的数据库的优势是能将DBMS的能力发挥到极致,能够使用SQL和DBMS实现很多程序实现的逻辑,与开发者相比,DBA优化过的数据库更为高效和稳定。如标题所示,本文旨在分享一名开发者的数据库设计经验,并不涉及复杂的SQL语句或 DBMS使用,因此也不会局限到某种DBMS产品上。真切地希望这篇文章对开发者能有所帮助,也希望读者能帮助笔者查漏补缺。


  一 Codd的RDBMS12法则——RDBMS的起源


  Edgar Frank Codd(埃德加·弗兰克·科德)被誉为“关系数据库之父”,并因为在数据库管理系统的理论和实践方面的杰出贡献于1981年获图灵奖。在1985 年,Codd 博士发布了12条规则,这些规则简明的定义出一个关系型数据库的理念,它们被作为所有关系数据库系统的设计指导性方针。深圳网站建设:http://www.longbasz.com 


  信息法则 关系数据库中的所有信息都用唯一的一种方式表示——表中的值。


  保证访问法则 依靠表名、主键值和列名的组合,保证能访问每个数据项。


  空值的系统化处理 支持空值(NULL),以系统化的方式处理空值,空值不依赖于数据类型。


  基于关系模型的动态联机目录 数据库的描述应该是自描述的,在逻辑级别上和普通数据采用同样的表示方式,即数据库必须含有描述该数据库结构的系统表或者数据库描述信息应该包含在用户可以访问的表中。


  统一的数据子语言法则 一个关系数据库系统可以支持几种语言和多种终端使用方式,但必须至少有一种语言,它的语句能够一某种定义良好的语法表示为字符串,并能全面地支持以下所有规则:数据定义、视图定义、数据操作、约束、授权以及事务。(这种语言就是SQL)


  视图更新法则 所有理论上可以更新的视图也可以由系统更新。


  高级的插入、更新和删除操作 把一个基础关系或派生关系作为单个操作对象处理的能力不仅适应于数据的检索,还适用于数据的插入、修改个删除,即在插入、修改和删除操作中数据行被视作集合。


  数据的物理独立性 不管数据库的数据在存储表示或访问方式上怎么变化,应用程序和终端活动都保持着逻辑上的不变性。


  数据的逻辑独立性 当对表做了理论上不会损害信息的改变时,应用程序和终端活动都会保持逻辑上的不变性。


  数据完整性的独立性 专用于某个关系型数据库的完整性约束必须可以用关系数据库子语言定义,而且可以存储在数据目录中,而非程序中。


  分布独立性 不管数据在物理是否分布式存储,或者任何时候改变分布策略,RDBMS的数据操纵子语言必须能使应用程序和终端活动保持逻辑上的不变性。


  非破坏性法则 如果一个关系数据库系统支持某种低级(一次处理单个记录)语言,那么这个低级语言不能违反或绕过更高级语言(一次处理多个记录)规定的完整性法则或约束,即用户不能以任何方式违反数据库的约束。


  二 关系型数据库设计阶段


  (一)规划阶段


  规划阶段的主要工作是对数据库的必要性和可行性进行分析。确定是否需要使用数据库,使用哪种类型的数据库,使用哪个数据库产品。


  (二)概念阶段


  概念阶段的主要工作是收集并分析需求。识别需求,主要是识别数据实体和业务规则。对于一个系统来说,数据库的主要包括业务数据和非业务数据,而业务数据的定义,则依赖于在此阶段对用户需求的分析。需要尽量识别业务实体和业务规则,对系统的整体有初步的认识,并理解数据的流动过程。理论上,该阶段将参考或产出多种文档,比如“用例图”,“数据流图”以及其他一些项目文档。如果能够在该阶段产出这些成果,无疑将会对后期进行莫大的帮助。当然,很多文档已超出数据库设计者的考虑范围。而且,如果你并不精通该领域以及用户的业务,那么请放弃自己独立完成用户需求分析的想法。用户并不是技术专家,而当你自身不能扮演“业务顾问”的角色时,请你选择与项目组的相关人员合作,或者将其视为风险呈报给PM。再次强调,大多数情况,用户只是行业从业者,而非职业技术人员,我们仅仅从用户那里收集需求,而非依赖于用户的知识。


  记录用户需求时,可以使用一些技巧,当然这部分内容有些可能会超出数据库设计人员的职责:深圳网站建设:http://www.longbasz.com 


  努力维护一系列包含了系统设计和规格说明信息的文档,如会议记录、访谈记录、关键用户期望、功能规格、技术规格、测试规格等。


  频繁与干系人沟通并收集反馈。


  标记出你自己添加的,不属于客户要求的,未决内容。


  与所有关键干系人尽快确认项目范围,并力求冻结需求。


  此外,必须严谨处理业务规则,并详细记录。在之后的阶段,将会根据这些业务规则进行设计。


  当该阶段结束时,你应该能够回答以下问题:


  需要哪些数据?


  数据该被怎样使用?


  哪些规则控制着数据的使用?


  谁会使用何种数据?


  客户想在核心功能界面或者报表上看到哪些内容?


  数据现在在哪里?


  数据是否与其他系统有交互、集成或同步?


  主题数据有哪些?


  核心数据价值几何,对可靠性的要求程度?


  并且得到如下信息:


  实体和关系


  属性和域


  可以在数据库中强制执行的业务规则


  需要使用数据库的业务过程


  (三)逻辑阶段


  逻辑阶段的主要工作是绘制E-R图,或者说是建模。建模工具很多,有不同的图形表示方法和软件。这些工具和软件的使用并非关键,笔者也不建议读者花大量时间在建模方法的选择上。对于大多数应用来说,E-R图足以描述实体间的关系。建模关键是思想而不是工具,软件只是起到辅助作用,识别实体关系才是本阶段的重点。


  除了实体关系,我们还应该考虑属性的域(值类型、范围、约束)


  (四)实现阶段


  实现阶段主要针对选择的RDBMS定义E-R图对应的表,考虑属性类型和范围以及约束。

深圳网站建设:http://www.longbasz.com 

0 0
原创粉丝点击