数据库设计概念模型要不要建?

标签: 数据库 设计 概念模型 | 发表时间:2013-01-25 21:06 | 作者:刘彻
出处:http://www.cnblogs.com/
      记得上学时,学习数据库相关课程中要求我们一步一步按照“需求”-->概念结构设计-->逻辑结构设计-->物理结构设计的步骤完成。但来到公司实际项目中时,我却发现几乎没有一个项目是完全按照这个步骤来建立数据库的。很多项目基本就是从需求中直接获取信息,然后进入逻辑结构设计阶段最后到片面的物理结构设计阶段,直到数据库可以使用,反复迭代该过程。
      我从来没有见过哪个项目画过一张概念结构设计阶段最重要的产物--E-R图,但我能见到一张由PD工具画的关系模式图,然后“工程师”们就用它生成数据库脚本,此时数据库建模算是完事了!至于物理结构设计阶段的一些工作,诸如索引和优化等那是以后的事情,甚至根本不予考虑。
      之所以这样,我觉得可能是出于以下几个原因。其一,我觉得主要可能是工期上不允许你花费这么多功夫,出一个完美的设计文档。其二,是没有必要按部就班的设计数据库,靠自己的经验足以!其三,就是压根设计人员不懂这么个设计方法。
       我今天主要是想说下这个概念结构设计要不要做的问题以及怎么做才是合理的。
       概念模型一定要做,这个阶段的最重要的产物就是E-R图,也就是实体联系图,这个或许也就是我们开发系统时常说的“实体”(Entity)这个词的源头了,实体这个概念是一个早期的概念约1976年,但面向对象编程技术真正兴起发展成熟应该在90年代。其实在我看来“实体”和“对象”是同一个概念,只不过E-R图数据库建模流行,才保留了这种叫法。而且数据库表也不叫什么“实体”,但可以叫一个“关系模式”,所以我就纳闷了,为什么一开发系统“工程师”们都在用实体这个词称呼与数据库表对应的类呢。我觉得实乃E-R图建模的流行惹的祸!
        另一个困扰我的问题是,既然大家都喜欢称呼“实体”(Entity),那为什么“工程师”们设计数据库的时候设计文档几乎看不到E-R图呢?其实我觉得E-R图是数据库设计必不可少的一步,尽管很多工程师忽略它,无视它。在我看来系统越是复杂就越需要建立E-R图模型,即便是小系统,建一个也费不了几分钟。在我看来,越是复杂的系统没有一个好的E-R模型,它越经受不起业务变更的考验,许多测试出来的业务Bug,多半是因为建了一个不科学的数据库,这样的系统可扩展性差。为什么我这么肯定呢?且听我慢慢道来。
      首先发明E-R图的人是伟大的,因为他给了我们一个强大的武器,让我们在设计数据库时有一个章法可循,而不是一味的依靠自己的经验完成,它是科学的方法论。他有什么作用呢?
        在需求阶段得到的应用需求应该首先抽象为信息世界的结构,才能更好的更准确的理解需求。所谓抽象就是对实际的人、物、事和概念进行人为处理,抽取所关心的共同特性,忽略非本质的细节,并把这些特性用各种概念加以精确的描述。
        前面说了一堆概念,我还是来说点实际的东西。我们经常遇到这样一个问题:这个属性是做为这张表的一个属性好呢,还是需要单独抽离出来作为一张表然后用外键关联好呢?比如说职工这个实体。按照一般的原则是:现实世界能作为属性对待的,尽量作为属性对待。但这是有一些条件判断的,这里给出两个准则。
   1、作为“属性”,不能再具有需要描述的属性。“属性”必须是不可分隔的数据项,不能包含其他属性。
   2、“属性”不能与其他实体有联系。
      如下图所示:如果职称不需要进一步描述的话,可以画到上图为止即可。但是一般说来如果系统要解决这个问题域的业务,根据现实世界的信息情况可知,职称应该要进一步描述其性质,职工的工资一般是和职称挂钩的,包括其他福利。当然,是不是非得挖掘出现实世界中问题域中的所有信息呢?答案是未必的。主要还是看客户的实际情况是怎样的,即便客户将来需要深挖深掘,那改动起来也是一个局部的,不会牵扯到其它实体已经存在关系。这样的模型是经得起需求变更的考验的。
     说了那么多,大家会问,建立这个模型有什么用,能直接转化成数据库表吗?我的回答是可以的,E-R模型是概念层的,它可以转化为某种数据库模型,可以是层次型数据库、网状型数据库以及关系型数据库等。由E-R图转化为某种数据库模型,都有对应的方法论,就是一种转换规则。这个我就不在这里啰嗦了,很多教科书都讲了怎么转换。
     这样一个E-R 模型是我们设计关系数据库的依据,在逻辑结构设计阶段映射成关系模式后,可能还需要考虑关系模式规范化的问题。关系数据库最基本的就是要满足1NF,不满足的就不是关系数据库了,它的要求就是关系模式的每一项都必须是不可再分割的。比如说,如果你的E-R模型是上面下图中的,那么你必须把职工和职称分别独立成一个关系模式(相当于两张表)。不能将职称直接作为职工的某个属性。
     规范化程度越高一般会导致关系模式越多,查询效率降低,但好处是数据冗余降低,各种插入删除异常消除。我认为一般能达到2NF或3NF就是一个折衷方案。一般为了性能的提高,需要进行反范式设计甚至添加冗余字段,这些都是合理的,但千万不要乱用,如果你的系统没有什么性能瓶颈,就不要做这些工作。不管怎么样。规范化也好反规范化也好,E-R模型是不能变的,它是设计数据库修改数据库的依据。
     我们设计的关系模式(表),一般是采用代理键,而不采用自然键,之所以这样设计,是因为这样可以让每一个数据项都有唯一简单的标识,表之间的连接也会大大简化。
      最后,我想说出我的一些其他想法,我觉得领域建模和这个E-R建模颇为相似,都是对现实世界信息的抽象,都是描述对象之间的关系,当然领域建模中的专业词汇可比E-R建模多多了,但领域模型基本包涵了E-R模型中的元素。实体间的one-to-one、many-to-many、自关联、继承等,领域建模都有。所以我的观点是可以将E-R模型看作是一个不完整的领域模型。
      如果这样的观点成立,那么我们以后可以先建立领域模型,然后将需要持久化的领域对象抽出来建立等效的E-R模型,方便对比。这样就能很好的解决一个问题就是,由ORM工具生成的实体类可以看作是领域模型的一部分,虽然不完善,但像是C#语言有Partil类特性,可以自己进行补充,给这些“实体”类添加领域逻辑行为,这样就可以将实体和领域对象统一起来管理而不需要非得分开维护管理啦!(*^__^*) 嘻嘻。
       请各位有识之士踊跃发表意见!谢谢。
     
       
 
 
 
 
 
 
 
 

本文链接

相关 [数据库 设计 概念模型] 推荐:

数据库设计概念模型要不要建?

- - 博客园_首页
      记得上学时,学习数据库相关课程中要求我们一步一步按照“需求”-->概念结构设计-->逻辑结构设计-->物理结构设计的步骤完成. 但来到公司实际项目中时,我却发现几乎没有一个项目是完全按照这个步骤来建立数据库的. 很多项目基本就是从需求中直接获取信息,然后进入逻辑结构设计阶段最后到片面的物理结构设计阶段,直到数据库可以使用,反复迭代该过程.

数据库设计规范

- - SQL - 编程语言 - ITeye博客
数据库表的命名以是名词的复数形式且都为小写,如cities, categories, friends等等. 如果表名由几个单词组成,则单词间用下划线("_")分割,如subscribed_pois,poi_categories等. 表名尽量用全名,表名限制在30个字符内. 当表的全名超过30字符时,可用缩写来减少表名的长度,如description --> desc;information --> info;address --> addr等.

数据库设计的三大范式

- 文斌 - 博客园-首页原创精华区
为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则. 在关系型数据库中这种规则就称为范式. 范式是符合某一种设计要求的总结. 要想设计一个结构合理的关系型数据库,必须满足一定的范式. 在实际开发中最为常见的设计范式有三个:. 如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式.

数据库设计注意事项

- - CSDN博客推荐文章
           数据库设计包括:库的设计,表的设计,字段的设计,主键和外键的设计,索引设计,约束设计. 1、数据库名称要明确,可以加前缀或后缀的方式,使其看起来有业务含义,比如数据库名称可以为Business_DB(业务数据库). 2、在一个企业中,如果依赖很多产品,但是每个产品都使用同一套用户,那么应该将用户单独构建一个库,叫做企业用户中心.

数据库设计的最佳实践

- - CSDN博客数据库推荐文章
1、使用定义明确的表或列名,并保持一致(例如,School、StudentCourse、CourseID). 2、使用单数形式的表名(即,用StudentCourse而非StudentCourses). 表代表了实体的合集,不需要复数形式. 否则你将在定义表时不得不使用“{”、“[”等字符(即为了访问表Student Course,你须得书写“Student Course”.

SQLite数据库存储引擎设计

- - searchdatabase
  SQLite是一个嵌入式库并且实现了零配置、无服务端和事务功能的SQL数据库引擎. 它在广泛领域内被使用,而且单线程读写性能与MySQL比肩,并且保证ACID性.   SQLite的存储后端是采用Btree实现,多个连接可以并发操作,但是同一时间只允许一个写着存在.   SQLite在硬盘上一个数据库一个文件,每个数据库文件头部保存有这个数据库的元信息,包括版本,大小,Btree根节点位置等等.

ORACLE数据库优化设计方案

- - CSDN博客推荐文章
本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了ORACLE数据库的优化调整方案. 关键词 ORACLE数据库 环境调整 优化设计 方案. 对于ORACLE数据库的数据存取,主要有四个不同的调整级别,第一级调整是操作系统级包括硬件平台, 第二级调整是ORACLE RDBMS级的调整,.

进销存数据库表设计

- - 数据库 - ITeye博客
CREATE TABLE user /*用户表*/ (. CREATE TABLE Supplier /*供应商表*/ (. NOT NULL, /* 供应商编号 ,主键 */. NOT NULL, /* 供应商名称 */. NOT NULL, /* 地址 */. CREATE TABLE Customer /* 客户表*/ (.

Typecho的数据库设计的学习

- - 标点符
Typecho是一款仿Wordpress,但相对Wordpress要简单的多的开源博客程序. 开发者大量的参考了WordPress的设计,去除了一些高级复杂的功能,实现了一个小而美的博客系统. 轻量高效:仅仅 7 张数据表,加上不足 400KB 的代码,就实现了完整的插件与模板机制. 超低的 CPU 和内存使用率,足以发挥主机的最高性能.

数据库优化:mysql数据库单机数十亿数据查询设计

- - Seay's blog 网络安全博客
    很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧. 如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据库软件设计复杂的集群关系,也不需要分布式水平分割等太重的优化. 只需要用mysql在本机笔记本搭建一个普通的环境就行.