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

数据库建模完成后,我们需要根据数据库模型使用某一个种面向对象语言设计出对象模型,对象模型与数据库模型的区别在于对象模型主要是为了使设计过程更加面向对象,抽象、继承、多态、封装,对象模型中的实体与数据库模型中的实体可能基本一致,但也只是对于小型的、业务不太复杂的系统才能可能,对于大型的复杂系统(比如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. controller中的路径明明书写正确,浏览器中访问的url也拼接正确,但报404

    Bug:controller中的路径明明书写正确,浏览器中访问的url也拼接正确,但报404 原因一:由于路由地址对应的处理方法存在同名而造成的,此时应该检查controller的方法们,看看有没有同 ...

  2. 【node.js】回调函数

    学习链接:http://www.runoob.com/nodejs/nodejs-callback.html Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调 ...

  3. selenium + python自动化测试unittest框架学习(四)python导入模块及包知识点

    在写脚本的时候,发现导入某些模块,经常报错提示导入模块失败,这里来恶补下python导入模块的知识点. 1.模块导入时文件查找顺序 在脚本中,import xxx模块时的具体步骤: (1)新建一个mo ...

  4. selenium + python自动化测试unittest框架学习(一)selenium原理及应用

    unittest框架的学习得益于虫师的<selenium+python自动化实践>这一书,该书讲得很详细,大家可以去看下,我也只学到一点点用于工作中,闲暇时记录下自己所学才能更加印象深刻. ...

  5. QTP基本方法4------手动写入信息到测试结果报告中

    可以使用写代码的方式添加结果信息到测试结果报告中. 结构:reporter.ReportEvent result,object,details,path result:状态:4种状态:micPass. ...

  6. pprint的惊喜

    因为我个人经常喜欢打印dir来看模块的方法,每次都是for循环换行,这个真好用 import pprint pprint.pprint (dir(pprint)) 执行下面的代码,会发现,没有自动换行 ...

  7. vim全选复制粘贴

    感谢来源:http://blog.sina.com.cn/s/blog_6e70abbd0100zbk9.html ggVG #gg: 光标跳转到首行,在vim才有效,vi中无效 #V 是进入Visu ...

  8. Android SDK 的SDK Manager打不开,一闪就退,无法启动,解决方法

    前一分钟还能打开,在eclipse中点了更新SDK后就启不动了 看下目录的修改时间,tool目录已经是今天的时间, 在升级过程中修改过了,给他改名 tempToolsDir 改名为tool 再尝试下启 ...

  9. 关于JQuery的异步注册

    在采用JQuery进行表单异步提交时,前台传入的是json数据格式,后台controller用map接收,再传回前台进行结果判断时,if-else接收结果()里面,尽量不要出现“=”,不然判断语句失效 ...

  10. Laravel源码分析--Laravel生命周期详解

    一.XDEBUG调试 这里我们需要用到php的 xdebug 拓展,所以需要小伙伴们自己去装一下,因为我这里用的是docker,所以就简单介绍下在docker中使用xdebug的注意点. 1.在php ...