医疗大数据行业的科研工作者,极少有用到数据库的时候,为什么?
数据复杂和学习成本高!EMR可以存入关系数据库,基因呢,影像呢,量表呢;前者学习 SQL了解下表设计基本就可以使用,而要对所有数据都使用合适的存储方式,学习成本非常高。
不方便!数据库的读取写入,用R或者python跑着跑着,还得去去命令行里定位错误,还要存储中间结果。
没必要!一篇文章发完,数据就扔那里了,一年能更新一次都是好的。
但是为什么还要了解数据库呢?除了数据安全,数据传承,数据管理之外,还有就是工程化需求,多种多样的项目均需要使用,比如:
本文斗胆浅谈一下各类数据库:
数据库简介
数据库的定义,数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。简言之,对用户来说只需要知道它是一个数据管理软件,这个软件像座冰山,冰山以下是它的底层设计,冰山以上是我们操作的软件。
从底层存储来说,所有的数据库都是和操作系统底层紧密相关的,而对操作系统来说,所有的存储都属于文件系统的范畴。比如一个操作系统的数据是由文件块来组织的,一个Oracle的数据块就不得不和它保持一致,这保证了数据存储读写的速度,可靠性等。这部分属于“系统层”的开发。
个人感受:
自从MySQL被Oracle收购后,Postgre使用也广泛起来,当然还有MySQL的直系后代MariaDB也有一定应用。
Oracle操作复杂(作为笨人,当初listner.ora上都能被卡好几天),费用高,非企业用被取代实属正常。
学习SQL,可以安装SqLite+Navicate即可(SqLite极度轻量,免去了Oracle,MySQL等的避免不了的配置和命令行的操作)
进一步,可以用R,python连接Sqlite学习
KV数据库又叫键值数据库,类似Python的字典,一个key对应一个文件,这个key一般是通过hash算法产生,保证了唯一性,这样再查询时就会很快找到对应文件,时间复杂度几乎为O(1)。
KV数据库还有个特点,他能根据调用率,将常用的KV的key存储在内存中,这样在用户访问时就能更快的命中。
KV数据库应用于大数据时代的海量查询需求,也是现在web服务流行的缓存中间件。
常用的有Redis,Memcache,Riak等。[2]
MongoDB Hbase等使用HDFS文件系统。(非绝对定义,MongoDB也可以不用分布式,Redis也可以支持分布式)
那什么是分布式文件系统?
分布式文件系统来源于分布式计算,最初的核心是HDFS+MapReduce.其是google当初推行的分布式数据存储系统,简言之,就是可以将数据存储在多台服务器上。
如果仅仅是存储,那么它和分布式存储就没区别了。它还支持分布式计算,即将常见的数据处理操作打散到多台服务器上,这块就是MapReduce的功能。
基于这套全新的存储计算分离的理念,产生了多种数据库设计,最终产生了hadoop家族。
Hbase
Hbase是一个列数据库,它直接操作HDFS,抢了部分Mapreduce的活。
Hbase适用于高性能、高可靠性、可扩展、实时读写、非结构化和半结构化的数据存储场景。K-V数据库就不具备高可靠性这个属性,因为K-V数据库主要是在内存中命中操作,涉及到持久化到硬盘上时,就可能发生错误;同时K-V数据库还可能面临hash碰撞等问题。
hadoop体系种还有其它各种组件,具备数据操作能力,广义上说有时也称之为数据库。
这些数据库对应特定需求,来源也很广,功能上可能会有重复(各公司基于hadoop开发,然后捐给apache,导致了一定重复)
比如flume这种日志采集系统。日志采集在大数据时代是相当大的需求,比如移动流量网关会实时记录用户访问的域名,访问的时间,访问消耗的流量,用于事后对账等。这种数据需要实时存储,由于数量很大对处理速度还有要求,来源很广还需要聚合多种来源。
比如HIVE,属于facebook开发,最初不过是普通的海量数据查询,它支持类似SQL的语法,然后将他转为MapReduce语法。
其它的还有pig,Mahout,Sqoop(ETL)等。
同时围绕这些产生了相应的中间件如zookeeper,kafka,还有国产的rocketmq等,均算作hadoop体系。
hadoop对分布式大容量计算和存储的支持,在生物大数据领域也有广泛的研究,也是多组技术导致的运算效率挑战的良好解决方案, 比如,slurm也已支持hadoop集群。[5]
MongoDB兼具关系数据库的查询能力,同时支持分布式,一般称为文档数据库,这里的文档指的是json文档(数据库一般将xml,json叫做文档类型)
它的数据存储是Json格式,类似一个可以嵌套多层的字典,这种存储模式让其有了”高伸缩性“的tag。
在医疗大数据领域, MongoDB自5.0起已经可以支撑时序数据处理,对比各种专业时序数据库如influxDB等,它具有使用便捷、学习成本低、轻量化、应用场景更广等特点。在做可穿戴设备、医院物联网等项目时,可以考虑使用Mongo。[6]
关系型数据库在关系复杂的数据,甚至关系链关系之类的数据时,表设计会比较复杂。一个东西很复杂的时候,就和人类的理解不太一致,耗费脑力。图数据库应运而生(尤其是数据结构化程度很低的情况下)。
Neo4j是一个高性能的图数据库。具备完全的事务特性,使用图(网络)而不是表结构存储数据。[7]
常见的描述都会提到嵌入式,嵌入式仅支持java(Neo4j支持java),嵌入式时,Neo4j在你的JVM种运行,你崩它也崩,你错它也错,好处是速度快。但是Neo4j也支持服务器模式。
Neo4j在医学科研中常见于知识图谱相关的研究,比如基因知识库GenomeKB[8]等。
所有科研人其实忽略了一个最重要的数据库:文件系统直存;也就是将数据本身直接存储于操作系统上。
大家习惯直接读取EMR数据如txt,csv;直接读取操作系统中的图片来跑模型;读取基因数据然后使用巨大的内存运算。
这种模式下,对于数据的管理一般是基于日志,对于数据的处理使用python/r/SHELL等脚本语言。
实际上,这就是科研最常见的模式。
数据的一致性,读写速度,图结构,分布式运算等需求,导致了之前的各类数据库的产生,然而数据库的本质是什么?是数据。
七周七数据库这本书有句话:当时间够长,不需要数据库。[9]
另外,在工作种需要用到数据库的时候,一般是工程化,生产环境中。
当今“开源盛世”,各种概念的数据库层出不穷,让人眼花缭乱,至于选择什么数据库,最重要的,还是要对业务深入了解的基础上,考虑成熟方案,减少试错成本。
以上这些数据库,都有一定学习成本,限于有限经验,如有错误,请批评指正,最后:
参考文献
循序渐进Oracle,盖国强,人民邮电出版社,2011.8
https://redis.io/
McDonald, Daniel et al. “redbiom: a Rapid Sample Discovery and Feature
Characterization System.” mSystems vol. 4,4 e00215-19. 25 Jun.
2019, doi:10.1128/mSystems.00215-19
Lubbock ALR, Lopez CF. Microbench: automated metadata management for
systems biology benchmarking and reproducibility in Python. Bioinformatics.
2022 Oct 14;38(20):4823-4825. doi: 10.1093/bioinformatics/btac580. PMID:
36000837; PMCID: PMC9563693.
https://hadoop.apache.org/
https://www.mongodb.com/
https://neo4j.com/
8. httpps://gkb.dcmb.med.umich.edu/
9. 七周七数据库,Eric Redmond,Jim R.Wilson,人民邮电出版社,2013.7