【译】SQL还是NoSQL?合二为一怎么样?

本文译自 《SQL or NoSQL? How about both?》 by David Maidment

如果你是伴随着结构化数据库成长起来的,请举手!你是否接触过SQL?也许在学校的时候使用过MS Access,而后在工作中涉猎过MySQL。

在数据库管理系统中,SQL作为主角已经有很多年的历史了。如果你是个专业的软件工程师,那么你很有可能已经经历了几十甚至上百个基于SQL的项目,而且很有可能是MySQL,或者MSSQL或者PostgreSQL。

虽然SQL有时会被诟病速度过慢,过于集中化,或者仅仅是老旧,但是不可否认,SQL很稳定,而且在过去的20年中,SQL已经成为了大多数基于web的软件的核心组成部分。不过近些年来,NoSQL数据库管理系统也有着显著的成长趋势。

如果你在创业公司工作,那么这是一个让你接触NoSQL数据库的好机会。创业公司通常没有什么遗留代码需要支持,还会雇佣年轻上进的工程师,鼓励他们探索一切能让它们一下子脱颖而出的会成为下一个大事件的技术。伴随着近些年技术创业公司的兴起,像NoSQL这样的技术一定会取得快速的进步。

另外,众多公有云设施的到来也加快了NoSQL技术的应用:我们可以使用一些简单的点击操作就搭建出一套分布式数据库集群。然后可以使用像NPM和Composer这样的工具一样,迅速的获得一套简单易用的SDK。智能IDE可以通过类型提示的功能帮我们编写一半的代码,而如果我们遇到了问题,我们可以从大量的文档或者有意于推广相关技术的社区使用者那里寻求帮助。

当年的那个最好的服务来自于最大的公司(当然要花钱),很少有人敢使用小公司产品的时代一去不复返了。这也是SQL可以上升到现在这个高度的原因,而NoSQL也正在做着类似的事情。

但是仅仅是因为一个好的旧技术(或者一个时髦的新技术)被用于一个项目中,就意味着它就应该被用于项目中吗?

选用合适的工具

无论是学习一个新的技术栈多有乐趣,或者在极短的时间内神奇的搭出一个原型有多好玩,作为职业软件工程师,我一向对盲目追随开发趋势持谨慎态度。虽然刚开始的时候每个东西都会打上下一个大事件的标签,但是大多数声称为下一个大事件的项目最终都无声无息的消失了。

在适当的时候做正确的判断是一个微妙的权衡。

SQL支持者能迅速的指出结构化关系型数据的好处。他们会拿出20多年来SQL一直活跃的支撑着软件库的稳定性来作为佐证。

而NoSQL的追随者则喜欢提出当数据不再需要依附于模式时数据将获得的自由度。他们会强调使用NoSQL数据库进行嵌套数据查询时查询能力的提升。

当然,两个阵营都对。但是同时又都是错的。

一些项目(比如,大多数的web应用),拥有非常结构化的数据。有时甚至不需要被搜索到;数字型主键就足够供开发者查询记录。

同样的,有些项目会需要存储庞大的非结构化数据,以供以后进行分析使用。任何处理日志的工具都属于这个类型。这样的项目使用一个SQL数据库是完全没有用的。

审视一个项目的用例是非常重要的,请把你的偏见和对某些技术栈的个人喜好抛在一边。

中间情况怎么办?

以上的应该是基本共识。但是如果你的用例哪边都靠不上怎么办?当你的项目需要将结构化数据存储在一个多层嵌套结构(比如,一个JSON对象)里怎么办?或者当你需要分析、处理非结构化数据,然后再将它存入一个结构化结构中怎么办?亦或者做了这些之后还要在子字段的子字段中查询数据怎么办?

这些才是要变的混乱不堪的地方。

你可以将数据整理为JSON对象,序列化然后存成text类型。近些年的SQL数据库甚至允许你使用JSON字符串进行查询操作。但是你怎么手动的浏览这些数据?你是否能在这个数据的一个子集有所变更的时候,轻松的更新这条数据?

SQL的主旨是将存储的数据标准化,将数据处理为有用的信息,然后把数据分离为一些通过外键联系起来的表。这通常是很有效率的,而且有助于手动浏览--你可以从数据的任一部分开始,根据表之间的关联进行一次数据查询。

但是怎么对一个关键词进行查询呢?你应该做一个包含查询,但是一旦你得到了成千上万条记录,那计算代价将是巨大的。

所以你会想也许你应该把数据存放在NoSQL数据库中。毕竟,这种事情比较适合由NoSQL数据库来做,对吗?

查询数据也许是很容易的,但是管理数据却是一个更大的任务。同时如果没有良好定义的表和模式,当你必须深入数据库进行手动管理时,数据库就像乱成一锅“文档汤”。你可能需要在每次查询时检索所有的数据,而这样的代价势必是沉重的。除非你限制返回列,但是这是否说明了一个问题,那就是没有一个合适的模式供你使用来搞定这件事?另外那些和其他数据有关联的数据记录怎么办?

所以话说回来,任何一个都不是可行的,但是两个加在一起似乎是个可行的解决方案。

解决方案

选择性的接受这个建议--毕竟每个项目的需求都不一样。

在很多情况下,应用在检索和显示信息上花费的时间要比花在更新信息上的时间多。我们在此不讨论聊天室或者区块链类型的应用,而是标准的网络应用。

首先会有一个稳定的数据来源流,但是并不需要在数据提交后立刻被访问到。通常数据被放在队列中,然后在几秒钟后由微服务来进行处理,这是完全可以被接受的。如果程序特别大,那么这将是程序设计的一个大需求点。

在这种机制下,可是考虑一下两种不同的数据库角色。有一个内部数据库--应用和相关的微服务与之通讯,处理那些用户看不到的工作--和一个外部数据库--直接反馈用户的请求。

内部数据库应该是能被轻松替换的。它会被知晓主键关系的内部服务访问,并且能够处理高结构化数据。外部数据库则需要能应对用户的任何请求;也许是一个简单的关键词搜索,或者是个复杂的带有拼写错误的关键字的布尔和关键字查询。

内部数据库可以是个常规的SQL服务,处理标准化数据,并以能完全描述数据复杂性的形式将数据分离并放入表中。不应该在这上面跑查询, 所以并不需要需要非常重视能以最小的开销进行联合查询。这非常依赖于来自于同一个初始化数据集的用以连接信息的外键。

它也会在每次CUD(create,update,delete)操作时触发一个动作。

这个触发动作会将信息收集到一个独立的文档中,比如一个嵌套的JSON对象。然后将这份文档插入或者更新到外部数据库中;也就是你选择的NoSQL数据库。对于这个目标,我个人在Elasticsearch上有很多的经验。

从用户那里来的请求,无论多么复杂,都能形成一个针对NoSQL数据库的查询,而这个查询是很快的。如果性能不够好,那么只要改变一下文档的结构(或者,比如说使用了Elasticsearch,索引要进行映射)或者重新对数据构建索引,来达到提升性能的目的。

外部数据库完全可以处理读请求。如果你想针对一款无需向下兼容的应用的搜索进行修改,你可以并行的将数据构建索引后放入新的数据库中,然后在结束后进行一次性的无缝切换。

最终的结果是一个近乎实时的、结构化的、易于更新的、查询非常快的、并且在吞吐量增加的时候非常容易水平扩展的NoSQL数据库。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 译者按:SQL与NoSQL之争近年来十分受到关注,既存在“SQL吃遍天下”这种理念,也不乏“NoSQL一定代表着先...
    selbstkennen梁晨阅读 3,235评论 0 19
  • SQL(结构化的查询语言)数据库是过去四十年间存储数据的主要方式。20世纪90年代末随着Web应用和MySQL、P...
    一个人不寂寞阅读 1,117评论 0 4
  • 本文转自:http://blog.csdn.net/sunxianghuang/article/details/5...
    Andy_0801阅读 1,338评论 0 8
  • --- layout: post title: "如果有人问你关系型数据库的原理,叫他看这篇文章(转)" date...
    蓝坠星阅读 775评论 0 3
  • 随着大数据时代的到来,越来越多的网站、应用系统需要支撑海量数据存储,高并发请求、高可用、高可扩展性等特性要求,传统...
    caison阅读 32,893评论 4 65