设计一个 60T 的医院数据仓库及其 OLAP 分析平台,你怎么做?

点击蓝色“有关SQL”关注我哟

加个“星标”,天天与10000人一起快乐成长

入行不久的程序员,最容易对自己和技术产生怀疑。整天担心学不到技术,不能在日活1亿的好项目里锻炼。其实完全没必要。项目一旦成为项目,它的新奇感也就没有了。剩下的就是苦逼的活儿,码字。

如何获取更多项目经验?看论文,看同行分享。拆解他们如何将需求分析到落地,如何来做技术选型,从中理清细节。技术细节从书中来,从源码中来,但最终掌握到可以杀鸡,还是可以宰牛,都还要靠我们自己的大脑和双手。

我在看《维度建模》的时候,也曾经懵逼。书上讲的知识是一回事,但没有看到实际的应用之前,觉得书本东西就是一层膜,朦朦胧胧,也云里雾里,不知道怎么用,哪里该用ODS,怎么分层,数据集市该怎么分类。这一系列的概念,在我看到真正的案例时,才豁然。

哪里才能看到真正的案例呢?最常见的做法,去看期刊论文。通常2-4页的论文,完整的介绍了一个实战项目的始终,有需求分析,也有架构实现,还有工具选型。资料丰富,内容精简,绝对好上手。唯一缺少的是技术细节的剖析,但有价值的事情,不就是自己去实现嘛,你说没有项目经验,自己7周弄7个项目,不是项目经验是什么?

不废话了,今天闲逛期刊网时,看到一篇极好的论文,医院数据仓库项目及其OLAP分析系统,分享给大家。相信看完这个案例后,你一定会对传统行业,生产制造,医院学校,电信银行等数据仓库及其BI应用有形象的了解。

看病的经历,大家都有。挂号,等待,问诊,检查,确诊,拿药,回家。就是这么个流程,中间涉及到的每一步,现代化的医院都会替你如实地记录下来。

做业务系统的朋友,脑袋里肯定在琢磨的是,用的什么前端架构,是Vue,Angular,还是JQuery?服务端用的是c#还是Java Spring Boot?

做数据库的朋友,想法不一样了,除了问采用Oracle还是SQL Server,心里最大的疑问,莫过于他们需要用BI吗,会有哪些主题,驾驶舱怎么玩的,大屏怎么实现的,医生的字儿那么有个性,这些病症的全文检索怎么办?

这样一琢磨,整个医院的软件体系结构也就出来了。两大块内容,业务系统与分析系统。

业务系统,通常指那些记录病人与医生之间每一次交互的行为信息记录系统。有正常门诊急诊使用的问诊系统,身体各部分检查的影像系统,还有各类体液检测系统,等等。

分析系统,通常是院方用来分析经营利润,医疗评判和医护人员效率的工具。大家看病,通常都会调侃,现在看病贵,看个小病就要好几百。那么事实上,医院真的就很赚钱吗,看下他们的医院经营分析利润报表就可以知道了。我没做过医院类的数仓也不好说,如果读者们有这个经验,不妨与我们分享下。对于医院来说,一个好名声,可能比利润更重要,所以依靠死亡率,重返率及手术并发率等指标,凸显院方医术先进,更是需要分析系统的保障。

所以,用简单的二分法来归类医院的信息系统,就非常简单的架构:

image

业务系统(OLTP)负责记录看病日志,而分析系统(OLAP)用来提供管理决策依据。

而具体而看决策分析系统,就有很多说法了:

image

几大配件:

  • 元数据管理

  • ETL

  • 数据模型

  • 数据可视化

  • 应用服务层

  • 管理运维层

上面的架构图看上去简单,分层也很清晰,所有的数据仓库及其BI平台,几乎都可以套用它。唯一不同的是实现方法。

在ETL方面,传统行业使用Batch方式多一些,比如SSIS, Informatica, DataStage 等等,走T+1的增量更新,今天的数据,明天才能反映在报表或者分析系统中。而互联网行业,使用 Kafka, Spark, Flink等等,走T+0的方式,做到实时更新。

在数据仓库和Cube方向,传统的企业使用Oracle, SQL Server, DB2的居多,大量的SQL Girl & Body 都会在这个方向上努力。而互联网行业,会加入Hadoop, Hive, Spark 等,来做分布式存储与计算。Cube方面,曾经的SSAS红极一时,yahoo号称有4000台的Cube,现在也逐渐被Kyligence所取代。

应用服务层,大家可能不常见,尤其对于传统行业的设计人员,利用BO,Hyperion,SSRS等封装好的产品,直接开发与分发报表,所以看不到单独开来的服务层模块。这一层,主要是承接可视化的需求,按照用户角色权限,设计,分发和响应报表请求。

BO,Hyperion,SSRS的产品够好,但唯一的缺陷,是缺少定制化,比如角色权限控制,定时或实时发送警告等。这块我也正在发力,准备做得更深入些,前两天在我的知识星球里,开玩笑说最近开了很多坑,这块算一个。比如 Web API 可以用NodeJS来完成,对于各类数据响应,使用Docker化部署的NodeJS API,可以线性扩展报表的响应性能。比如使用 Ado.net/Adomd.net 可以将数据库与Cube的访问同时写进一个Web Service里面,这样拉取数据的效率会高很多。

可视化,大家多少都了解些。Excel的Pivot就是最简单的可视化例子。各类报表工具,Tableau, BO, SSRS, Hyperion,也是层出不穷。当然还有完全可定制化的图表库,比如使用 Angular, D3.js等javascript库,可以开发出更人性化的报表和分析界面。现在流行的大屏,驾驶舱等等,都是这样衍生出来的,功能上还是在提供数据可视化的表达窗口而已。

差不多了,对于一个基础入门来说,看懂这个框架图,详细的扣一扣技术细节,一个完整的项目经验,应该就算是有了。

公众号《有关SQL》后台回复“医院OLAP”,可以拿到这份我在网络上收集的论文。

--完--

往期精彩:

本号精华合集(三)

如何写好 5000 行的 SQL 代码

如何提高阅读 SQL 源代码的快感

我在面试数据库工程师候选人时,常问的一些题

零基础 SQL 数据库小白,从入门到精通的学习路线与书单