数据库的历史已经有50多年了,似乎这50年里数据库从一个轮回走向了另外一个轮回。最初的数据库世界是碎片化的,每个硬件厂商都有自己的数据库系统,我用过的最古老的数据库系统是一台ICL小型机上的记录式数据库系统,用COBOL来读写。
随着计算机网络的发展,特别是互联网的普及,数据库被几大通用关系型数据库垄断了,数据库世界有被Oracle等大厂一统天下的趋势。有几年,我甚至认为关系型数据库已经没有什么可以创新的了。不过这些年数据库领域的发展让我这个十分浅陋的想法变得如此的可笑。
随着企业信息化对数据处理要求的不断提高,我们有太多种类的数据需要处理了。应用的类型也是丰富多彩。某些应用程序需要同时访问用于存储结构化数据的关系数据库(例如 PostgreSQL)、用于内容缓存的内存数据库(例如 Redis)、存储海量物联网数据的时间序列数据库和用于分析的数据仓库。现在仅在DB-ENGINES上就收录了352种数据库,其中147种是关系型数据库(这些关系型数据库中,很多还是多模数据库)。
不同业务类别的企业,也可能更倾向于选择某种不同的数据库。比如银行或金融机构可能会选择 Oracle 或 PostgreSQL 等关系 DBMS 来确保其结构化数据的 ACID事务;运营大型在线多人游戏的互联网服务商更喜欢使用 Redis 等键值 NoSQL 数据库;
社交媒体分析企业通常会选择图数据库;而物联网 企业会选择时间序列数据库来支持其传感器或网络数据。这并不是完全出于应用特点的选择,而更多的是习惯与历史传承。对于一个企业来说,选对了数据库,那么你的信息系统建设就成功了一小半了。

前几天我在REDDIT上参与了一个帖子,有个朋友问了一个数据库选型的问题,他在做一个市场项目,需要管理用户、身份、产品、评论、点赞、标签、搜索等功能。他在PostgreSQL和Mongodb之间彷徨,希望得到大家的帮助。
如果按照应用场景来划分,这个系统主要是一个关系型数据为核心的系统,不过也会涉及到一部分文档数据。从架构师设计上来看,习惯于关系型数据库的团队很可能会选择PostgreSQL,再加上ES或者Mongodb来存储一些文档类的数据。
而如果是一个受过比较多的互联网思维熏陶的设计师,有可能会直接选择Mongodb单一的解决方案来做这个项目了。当然做出任何一种选择,只要团队对数据库以及相关的开发是擅长的,那么哪怕遇到一些问题,也是能解决的。不过如果一个对Mongodb知之甚少的团队,贸然选择Mongodb,那么可能他们会吃很多苦头。
实际上,在早期我们的数据库选型并没有那么麻烦,因为关系型数据库主要就是做关系处理的,文档数据库也只是专注于文档处理。而随着数据库产业的内卷,一个功能单一的数据库产品可能可以在开源社区获得青睐,但是无法在商业上获得成功。从DB-ENGINES上可以看到,排名前八位的数据库无一不是多模数据库。
经过多年的发展,文档数据库MongoDB也变成了一种多模数据库,甚至在一些简单的事务的支持上也相对不错。如果你的团队喜欢node.js,熟练掌握Mongoose组件,那么这个项目使用MongoDB也没啥大问题。
不过从另外一个方面来说,PostgreSQL从出生起就是一个学院派的数据库,其多模数据库特性依然十分明显。在内卷和碎片化的数据库领域演进过程中,PostgreSQL在文档数据支持方面也变得越来越出色,MongoDB能做的很多工作,PG做的也不赖。这也是目前我们出现数据库选择性障碍的主要因素之一。
如果这个项目今后的用户不大,那么从数据库选择的角度上看,选任何一个都不算错误,选哪个要看开发团队对这两种数据库的掌握和熟悉程度了。不过如果这个项目最后要服务的用户群体十分巨大,那么这个选择将十分重要,这决定了今后项目开发的难度。如果这个项目今后的交易型功能十分复杂,那么如果选择MongoDB,开发团队将会遇到很多mongoDB原生态功能无法支撑的处理。
虽然如此,只要研发团队够强大,这些仅仅是会成为障碍,并不能成为决定项目成败的关键。数据库搞不定的事情,通过应用代码去搞定,就不会有任何问题了。
前两年我有一个客户上一个新系统,当时整体框架设计就是采用微服务,于是引入了领域建模,将整个系统划分为近30个领域。原本计划应用采用阿里云的微服务框架,数据库使用RDS。不过开发过程中,研发团队发现开发人员能力不足,于是数据库仍然恢复使用Oracle,并将30个领域数据库合并为6个Oracle数据库。
这种临阵退缩导致了开发团队在微服务架构下的大撤退,虽然应用服务仍然按照30个领域跑在容器里,不过大量的业务逻辑依然下沉到了数据库里。
因为微服务架构下的IT技术政策不允许使用Oracle dblink,开发团队又没有能力将很多数据关联全部拆分为接口和服务调用,于是天才的架构师想出了数据复制,在6套数据库之间创建了上百条复制链路,确保每个微服务都不跨库访问。我想这样的披着微服务外衣的集中式架构的应用系统,今后就是运维的灾难。
在这个数据库产业碎片化的内卷时代,数据库选择确实不是一件十分简单的事情,既然如此复制,有些时候甚至无法把它当成一件事情,研发团队对数据库的掌握能力才是最为关键的事情。
是选择一个更合适的数据库产品,还是提升开发团队驾驭微服务应用的能力,抑或是请高水平的数据架构师来做设计,这些都是解决问题的方法,具体用哪一种,每个企业的IT部门都有一把辛酸泪需要倾诉。有时候作为门外的人,是不一定看得清楚的。
什么是数据库的概念设计、逻辑设计、物理设计,以及三者的关系
1.概念设计;对用户要求描述的现实世界(可能是一个工厂、一个商场或者一个学校等),通过对其中住处的分类、聚集和概括,建立抽象的概念数据模型。 这个概念模型应反映现实世界各部门的信息结构、信息流动情况、信息间的互相制约关系以及各部门对信息储存、查询和加工的要求等。 所建立的模型应避开数据库在计算机上的具体实现细节,用一种抽象的形式表示出来。 以扩充的实体—(E-R模型)联系模型方法为例,第一步先明确现实世界各部门所含的各种实体及其属性、实体间的联系以及对信息的制约条件等,从而给出各部门内所用信息的局部描述(在数据库中称为用户的局部视图)。 第二步再将前面得到的多个用户的局部视图集成为一个全局视图,即用户要描述的现实世界的概念数据模型。 2.逻辑设计;主要工作是将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式。 与此同时,可能还需为各种数据处理应用领域产生相应的逻辑子模式。 这一步设计的结果就是所谓“逻辑数据库”。 3.物理设计;根据特定数据库管理系统所提供的多种存储结构和存取方法等依赖于具体计算机结构的各项物理设计措施,对具体的应用任务选定最合适的物理存储结构(包括文件类型、索引结构和数据的存放次序与位逻辑等)、存取方法和存取路径等。 这一步设计的结果就是所谓“物理数据库”。 4.三者关系:由上到下,先要概念设计,接着逻辑设计,再是物理设计,一级一级设计。
大数据云计算好不好学习?
大数据云计算只是一个相对抽象的概念。 基于这个概念下有上游的服务型产业和下游的需求型产业。 服务型产业也就是阿里云这类提供大数据和云计算的公司,这也并没有云计算大数据的专职岗位,如今社会尤其像云计算这么大规模的服务型应用,都是大型团队协作开发,并不是说你学了云计算和大数据就能搞定这一切,在这样的团队中,技术类型最顶端的最核心的也就是云计算架构师,成为云计算架构师,首先你得是一名架构师,然后有丰富工作经验后学习云计算架构方案,这块可以了解亚马逊的AWS认证,能考过这个认证基本就能具备云计算架构师的资格。 当然在这之前计算机核心原理,网络工程、主流编程语言、数据存储、Linux、云安全技术等都是你成为云计算架构师的基础知识储备。 所以能熬到云计算架构师的不是锃光瓦亮的关头也是万中挑一的武学奇才。
怎么样学习注册表?
注册表简介Windows的注册表(Registry)实质上是一个庞大的数据库,它存储这下面这些内容:软、硬件的有关配置和状态信息,应用程序和资源管理器外壳的初始条件、首选项和卸载数据;计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联, 硬件的描述、状态和属性;计算机性能纪录和底层的系统状态信息,以及各类其他数据。注册表的结构在Windows中,注册表由两个文件组成和,保存在windows所在的文件夹中。它们是由二进制数据组成。包含系统硬件和软件的设置,保存着与用户有关的信息,例如资源管理器的设置,颜色方案以及网络口令等等。Windows为我们提供了一个注册表编辑器()的工具(图1),它可以用来查看和维护注册表。由图我们可以看到,注册表编辑器与资源管理器的界面相似。左边窗格中,由我的电脑开始,以下是六个分支,每个分之名都以HKEY开头,称为主键(KEY),展开后可以看到主键还包含次级主键(SubKEY)。当单击某一主键或次主键时,右边窗格中显示的是所选主键内包含的一个或多个键值(Value)。键值由键值名称(Value Name)和数据(Value表示。2.二进制值在注册表中二进制值是没有长度限制的,可以是任意字节长。在注册表编辑器中,二进制以十六进制的方式表示。在本站中以a=hex:01,00,00,00方式表示。值DWORD值是一个32位(4个字节)的数值。在注册表编辑器中也是以十六进制的方式表示。在本站中以a=dword表示。注册表的备份与恢复如果注册表遭到破坏,Windows将不能正常运行,为了确保Windows系统安全, 我们必须经常的备份注册表。Windows每次正常启动时,都会对注册表进行备份,备份为0, 备份为0。它们存放在Windows所在的文件夹中,属性为系统和隐藏。以下为2种备份注册表的方法:1,利用Windows中的注册表编辑器()进行备份运行,单击“文件“-->“导出注册表文件“命令,选择保存的路径,保存的文件为*, 可以用任何文本编辑器进行编辑。2,利用Win95光盘上Other\Misc\ERU\紧急事故恢复工具(Emergency Recovery Utility)。利用这个工具不但可以备份和恢复注册表,还可以备份硬盘中的任何文件。恢复:当注册表损坏时,启动时Windows会自动用和的备份0和0进行恢复工作,如果不能自动恢复,可以运行(它可以运行在在Windows下或DOS下),导入备份文件。也可以运行进行恢复。如果您没有进行备份或者注册表损坏的非常严重,那么您可以试试最后一着:在c:\下有一个System.1st文件,属性为隐藏和只读,它记录着安装Windows时的计算机硬件软件信息,用这个文件覆盖。但是这样的话您安装的应用软件可能会无法运行,必须重新安装。注册表修改方法通过修改注册表我们可以实现一些特殊的功能,但是注册表又是十分脆弱的,一个不小心就会出现错误。那么我们怎么样来修改注册表呢?我总结为以下几种方法:1.软件修改(安全)通过一些专门的修改工具来修改注册表,比如:MagicSet、TweakUI、WinHacker等等。其实控制面板就是一个这样的工具,只不过功能简单一些。2.间接修改(比较安全)将要修改的写入一个文件中,然后导入注册表中。文件的基本格式为:REGEDIT4[HKEY_LOCAL_MACHINE\Software\Super Rabbit\MagicSet]@=Super Rabbit Magic Set For Windows 98 V2.92a=dwordb=hex:02,05,00,00……[HKEY_LOCAL_MACHINE\Software\SCC\QuickViewer]……第一行为“REGEDIT4”,必须大写。 第二行为空行。 第三行使用[]括起子键分支,其中HKEY_LOCAL_MACHINE\Software\Super Rabbit\MagicSet就是一个子键分支。 第四、五、六行是该子键下的设置数据。 其中@表示注册表编辑器右窗格中的默认键。 以下类似。 这样做的好处是可以避免错误的写入或删除等操作,但是要求用户了解注册表的内部结构和文件的格式。 3.直接修改(最不安全,但最直接有效)就是通过注册表编辑器直接的来修改注册表的键值数据项,这样做会避免在注册表中留下垃圾(虽然都很小,但越来越多会拖慢系统速度),但是要求用户有一定的注册表知识,熟悉注册表内部结构而且一定要小心谨慎。
发表评论