软件开发的生命周期中,数据库建模后,在某个数据库系统中形成相对应的表,之后再根据数据库模型设计相关的业务对象及其关系.这其实是进行了两次设计,一次是数据库模型设计,数据库模型设计是根据现实业务提取出来的模型,这个模型最终是产生了业务数据之间的关系以及业务数据的存储方式.

数据库建模完成后,我们需要根据数据库模型使用某一个种面向对象语言设计出对象模型,对象模型与数据库模型的区别在于对象模型主要是为了使设计过程更加面向对象,抽象、继承、多态、封装,对象模型中的实体与数据库模型中的实体可能基本一致,但也只是对于小型的、业务不太复杂的系统才能可能,对于大型的复杂系统(比如HIS系统),对象模型与数据库模型中的实体要一致则基本不可能.

两次不同角度、不同层面的设计(数据库模型关注存储,对象模型关注OO表达)增加了我们的工作量,而且两次设计之后产生了差异,最终导致了数据库中的实体(表)与对象模型中的实体(对象)产生不一致了,属性字段(数据库中的字段、对象中属性)也可能不一致了,在实际的开发中,必须很熟悉对象的属性对应到哪个表上的字段,这无疑增加了我们的学习成本。

也许,这就是各种ORM框架(如Nhibernate、Entity Framework)的主要目标,目前,ORM框架有轻型的,有重量级的,ORM框架的优劣我们先放一边,从众多项目使用情况来讲,有成功的、也有失败的,从工程师对ORM框架的态度上来看,有嗤之以鼻者、也有疯狂追捧的。每个人的计算方法不一样,各种滋味,还自有自己去体会才行。

话说回来,我们还是回到原始,在没有ORM框架的情况下,如何设计好出色的OO模型,我这里以HIS系统中的患者基本信息来举例。

在数据库系统设计中,在遵循了数据库范式的同时,为了提高效率、减少服务器压力,会进行一定的冗余,比如次例的HIS系统中,患者的基本信息会存储在一种表中,但是对象设计如下:

BaseClass类是抽象的基本类,存储了在业务系统中方便查找患者的五笔码、拼音码、自定义码等,PatientInfo类包含了患者的姓名性别、入院相关信息、费用信息、地址信息、各种编号等,而这些信息又分了几个单独的实体和枚举,有患者性别枚举,患者状态信息枚举,以及定位患者的位置信息类(Plocation类),存储患者各种编号的类(PID类),存储与患者相关的金钱有关的类(MoneyInfo类),这些类的属性对对应到数据库患者基本信息表中的每个列。

结后语:

个人对ORM框架是完全接受并且非常喜欢的,但我认为不是每个项目、每个系统都适合使用ORM,如果能把对象模型设计好还是能有一个维护性好、扩展性好、新人学习成本低的系统。目前我认为对于HIS系统来说,不太适合使用ORM框架,因为HIS业务太复杂,需求很多,变化很大,而一般的HIS厂商往往需要投入开发人员在客户现场进行本地化开发,在现场加字段、加表是常有的事情,这使得HIS厂商必须雇佣软件开发水平较高的人员在驻场开发,使用ORM增加了现场人员的学习压力,间接提高了HIS厂商的投入成本。

HIS系统患者实体OO设计的一点思考的更多相关文章

  1. OO设计

    Todd.log - a place to keep my thoughts on programming 评OO设计 昨天在微博上看到InfoQ提供了一本新书<完美软件开发:方法与逻辑> ...

  2. OO设计原则 -- OO设计的原则及设计过程的全面总结

    这部分增加一点自己的感想,OO设计原则下面讲述的很清晰;看完之后有点感想如果我们在实际开发当中能够把这些原则熟烂于心的话那我们的代码质量和个人能力会有很显著的提神.根据自己的实际经验看很多开发者在开发 ...

  3. OO设计基本原则

    OO本身就是一种大的设计模式,它是随着软件规模越来越大产生出来帮助人们建模和开发的理念,生来就带着封装.继承.多态等可复用基因.为了充分发挥这些基因的功效,使用者需要遵守一定的原则,就是所谓的面向对象 ...

  4. atitit. 日志系统的原则and设计and最佳实践(1)-----原理理论总结.

    atitit. 日志系统的原则and设计and最佳实践总结. 1. 日志系统是一种不可或缺的单元测试,跟踪调试工具 1 2. 日志系统框架通常应当包括如下基本特性 1 1. 所输出的日志拥有自己的分类 ...

  5. 基于Flume的美团日志收集系统(一)架构和设计

    美团的日志收集系统负责美团的所有业务日志的收集,并分别给Hadoop平台提供离线数据和Storm平台提供实时数据流.美团的日志收集系统基于Flume设计和搭建而成. <基于Flume的美团日志收 ...

  6. 基于Flume的美团日志收集系统(一)架构和设计【转】

    美团的日志收集系统负责美团的所有业务日志的收集,并分别给Hadoop平台提供离线数据和Storm平台提供实时数据流.美团的日志收集系统基于Flume设计和搭建而成. <基于Flume的美团日志收 ...

  7. 转:基于Flume的美团日志收集系统(一)架构和设计

    美团的日志收集系统负责美团的所有业务日志的收集,并分别给Hadoop平台提供离线数据和Storm平台提供实时数据流.美团的日志收集系统基于Flume设计和搭建而成. <基于Flume的美团日志收 ...

  8. 瓜子IM智能客服系统的数据架构设计(整理自现场演讲)

    本文由ITPub根据封宇在[第十届中国系统架构师大会(SACC2018)]现场演讲内容整理而成. 1.引言 瓜子业务重线下,用户网上看车.预约到店.成交等许多环节都发生在线下.瓜子IM智能客服系统的目 ...

  9. Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战

    Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战 Java生鲜电商平台-  什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定 ...

随机推荐

  1. ValueError: Invalid leaf XXX

    Bug:ValueError: Invalid leaf XXX 无效的搜索条件——检查search函数中的domain表达式格式!是否少了括号! search(['user_id', '=', us ...

  2. ubuntu16.04 Detectron目标检测库配置(包含GPU驱动,Cuda,Caffee2等配置梳理)

    Detectron概述 Detectron是Facebook FAIR开源了的一个目标检测(Object Detection)平台. 用一幅图简单说明下Object Detection.如Mask R ...

  3. 2019.3.5 控制台输出log4j得有些报错信息

    报错内容如下 log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.Sp ...

  4. CUDA 纹理的使用

    纹理绑定有两种,一个是绑定到线性内存就是用cudaMalloc();cudaMemcpy();开辟的内存空间,另一种是绑定到cudaMallocArray, cudaMemcpyToArray开辟到的 ...

  5. Linux环境变量及其设置

    简介 环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或多个应用程序将使用到的信息.Linux是一个多用户的操作系统,每个用户登录系统时都会有一个专用的运行环境,通常情况下每个用户的默认的环 ...

  6. Loadrunner测试webservice协议总结

    Loadrunner测试webservice协议总结 一.协议选择 1.打开Virtual user generator,新建脚本,选择webservice协议

  7. 网络测量中基于Sketch方法的调查

    目录 LD Sketch SeqHash What's New reversible sketch Count-Sketch和Count-min sketch Diamond Sketch: Accu ...

  8. LINUX下安装pcre出现WARNING: 'aclocal-1.15' is missing on your system错误的解决办法

    1.下载安装包 wget https://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz 2.解压 tar -xzvf automake-1.15.tar. ...

  9. Set集合之TreeSet类

    TreeSet简介 TreeSet是SortedSet接口的实现类,正如SortedSet名字所暗示的,TreeSet可以确保集合元素处于排序状态.与HashSet集合相比,TreeSet还提供了如下 ...

  10. React Native封装Toast与加载Loading组件

    React Native开发封装Toast与加载Loading组件 在App开发中,我们避免不了使用的两个组件,一个Toast,一个网络加载Loading,在RN开发中,也是一样,React Nati ...