首先简单的说一下我对数据、模型、数据模型、数据模型要素以及数据模型的分类的理解。

数据:是符号。例如 张三

    模型:现实世界事与物特征的抽象与模拟。如飞机模型、空气动力模型。

    数据模型:通过对现实世界的事与物主要特征的分析、抽象,为信息系统的实施提供数据存取的数据结构以及相应的约束。 数据模型的要素由操作、数据结构以及约束。通常情况下我们在数据模型设计的时候考虑最多的是数据结构而忽视了其他两个要素。

根据数据模型的应用层次可以分为概念数据模型模型(概念模型)、逻辑数据模型(数据模型)、以及物理数据模型(物理模型)。

    概念模型:从业务的角度来考虑问题,主要用来描述事与物的概念化结构,其用途是统一业务概念,作为业务人员和技术人员之间沟通的桥梁。其描述方法有ER图、Merise图、Barker图等。在建立概念模型的过程中主要考虑的是现实世界中的事与物以及他们之间的关系而不用关注事与物的具体属性。

    逻辑数据模型:从数据库的角度来考虑问题,在概念模型的基础上对事与物属性的细化以及对象整合。其描述方法有ER图。在这个层面数据模型可以分为层次、网状、关系模型。

物理模型:面向具体的物理计算环境。


    下面我们来说一下什么样的数据模型才是好的数据模型。 数据模型的设计是自由的任意的,对于同一个系统或者同一个表每个设计人员的设计结果都是不一样的,那么有没有什么标准来评价数据模型的好与坏呢。我觉得应该从以下几个方面来考虑。

1:是否满足现有的业务需求。

2:是否易于应对未来的可能的业务变更。好的扩展性、很强的灵活性。

3:是否高效。对开发人员来是否简单高效,运行是否高效。

    最后来说一下在数据模型设计过程中的感悟。

0:数据模型的分层与抽象,数据模型按照考察的系统不同可以分为三个层次:通用层、行业层、业务层,通用层从社会、自然的角度去考察对象;行业层从行业的角度去考察对象;业务层从所在公司的业务发展去考察对象,这三个层次是从抽象到具体的过程,越抽象越有通用性。在某个具体的层都可以分别对实体、关系进行抽象以达到相应的灵活性、扩展性。在具体实现的过程中,将稳定的实体、实体关系与多变的业务对象分别建模,保证模型的稳定性。


1:关于扩展性 可以通过横表转纵表的方式。 视图可以为开发人员提供一个接口屏蔽底层具体实现的复杂性同时提高系统的扩展性。

2:关于数据源 要有元数据的概念同样的数据尽量在一个源头去取,这对数据的维护以及数据一致性都很有好处。

3:关于抽象 抽象是我们分析问题解决问题非常重要的手段,抽象能力的高低充分体现了数据模型设计人员的水平。        

4:关于动静分离 动静是相对的没有绝对的动与静。在实体属性的选取、表空间等方面考虑动态数据与静态数据分离。 用一个例子来说明这个问题吧。 在电子商务系统中从灵活的角度来看后端管理系统会涉及多个表,但是对于前端展现来说如果从多个表获取数据的话那么在高并发的情况下会严重的影响性能。于是乎就有了发布这个环节。发布的目的除了对信息进行审核外,还把相关的信息发布到一个表或者缓存中再或者生成静态页面,如果使用oralce的话还可以使用物化视图。

5:关于数据字典 要重视数据字典这对开发人员理解数据模型的设计以及以后的维护都非常重要。

6:如何进行数据模型设计

【01】首先是要了解业务然后建立概念模型,确定实体以及实体关系。

【02】在概念模型的基础上生成逻辑模型,确定实体属性,标准化数据(消除多值字段达到第一范式;消除部分依赖达到第二范式;消除传递依赖达到第三范式)。

【03】模型验证:通过具体的业务来验证模型是否能满足要求。

【04】在逻辑模型的基础上生产物理模型。

7:三少 整个模型中表应该尽量的少;在一个表中字段应该尽量的少同时复合主键字段应尽量的少

8:如果在大数据量或者高并发的情况下,要充分考虑数据库的压力,事先要考虑哪些表可能是热表。要尽量的降低模块的耦合。如果使用的是oracle RAC 的话要考虑一下多实例竞争的问题,不同的模块访问不同的实例。

9:一定要做压力测试、要做充分的压力测试,要不上线后会死的很惨,移动总部的一个web项目应为没有做充分的压力测试,导致上线后不的不挂维护页面,动用了n多的资源去解决问题。

10:在做模型设计的时候要考虑项目的各个生命周期阶段对模型的要求,不能仅仅把眼光限制在功能的实现,例如要考虑模型对以后维护的支持,对于大表的数据如何进行清除、转历史,显然delete、insert是首先可以想到的但是不可行的方法,建议做分区转换。

11: 数据模型设计对系统可变性的支撑:业务系统的变化点通常是流程相关部分,这部分会随着不同的公司、公司的不同发展阶段而变化,因此最好将这部分单独建模,独立于系统核心模型之外。

12:动静分离,11条说的是将多变的业务过程相关实体同稳定的实体以及实体关系分离,用来适应业务变化;动静分离从系统运行的角度,将实体进行分类、实体数据进行拆分,用以提升系统的稳定性、可扩展性。

13:数据模型是对现实世界的模拟,不是对现实世界的完全照搬,对于一个实体一定要重点考虑这个实体在系统内的角色,对这个角色建模而不是照搬现实世界。

    以上是本人在数据模型设计方面的一点体会,写的不够细,以后会针对某点给出图文化的实例来具体说明,希望大家多给宝贵意见,共同交流。


参考:http://movenut.iteye.com/blog/524185