做一个新业务,我该选择SQL还是NoSQL?
很多时候我们都会有这样的疑问。
如果这时候直接去看MySQL、Mongo、HBase、Redis等数据库的用法、特点、区别,其实有点太着急了。
这时候,最好从「数据模型」开始讨论。
现在最著名的数据模型应该是SQL,它基于Edgar Codd在1970年提出的关系模型:
数据被组织成关系(relations),在SQL中称为表(table),其中每个关系都是元组(tuples)的无序集合(在SQL中称为行)。
那什么是NoSQL?
现在很多非关系型数据库会被称为NoSQL,其含义往往被解释 “Not only SQL”。
采用NoSQL的驱动因素在于:
SQL 和 NoSQL数据库的差异有很多,包括容错性和并发处理,我们这里暂时只讨论数据模型的差异。
关系型模型的主要优势在于:
注意,简单的多对多适合关系型模型,复杂的多对多更适合图模型
我们以文档型NoSQL为例,它和SQL对比的核心优势在于:
「模式灵活性」的特点,往往被称为「schema-fress模式」,但是我们并不能将它直接理解为“无模式”。
因为我们在读取数据时,往往存在某种数据结构的隐式转换,所以我们称之为「读时模式」更准确(数据结构是隐式的,只有读取时才解释)。
而传统关系型数据库,对应可以称之为「写时模式」(模式是显示的,并且在写入数据库时被约束必须遵守)。
这两者差异跟编程语言中的动态检查(运行时)和静态检查(编译时)比较类似。
「模式灵活性」的优点在于:
「模式灵活性」带来的损害则是需要应用层做好结构约束,并且保证对历史数据的兼容性。
一般典型关系型场景,「模式灵活性」反而会导致难以维护。
注意注意,局部性优势仅适用于需要同时访问文档中大部分数据的场景。
如果我们的查询需要访问整个文档,那么存储局部性具备显著的性能优势。
此时,如果数据被划分到了多个表中,则需要访问多个表来检索数据,会浪费更多的磁盘IO并花费更多的时间。
如果我们的访问只需要文档中的一小部分数据,那么对于大型文档来说就是一种浪费。
对于一份数据存储,「数据模型」的建立, 就是考虑应该通过 SQL 还是 NoSQL 进行 数据组织 。
那么,结合前面对SQL和NoSQL的介绍与对比,我们总结了以下几个维度,来具体考虑如何建立「数据模型」。
多对一或者多对多,一般考虑SQL。
一对多的关系,可以考虑SQL或者NoSQL。
如果我们的查询通常需要访问整个文档,那么存储局部性具备显著的性能优势,关系型的join性能较差,因此可以考虑NoSQL。
(业务上,一般会通过整体结果缓存,对关系型join查询加速)
如果通常是局部数据对象、独立实体查询,考虑SQL。
如果需要超高的写入吞吐量,考虑NoSQL。
数据模型分析主要是根据业务场景区分 关系型 还是 非关系型。
延迟考虑具体数据库选型,用RDS还是Mongo还是其他数据库,它们之间的功能性差异在逐渐变少。
具体选择可以结合 研发人员熟悉程度、数据规模、其他非功能性需求 来判断。
一些例子:
参考:《数据密集型应用系统设计》
关于目前低代码在技术领域很活跃!
低代码是什么?一组数字技术工具平台,能基于图形化拖拽、参数化配置等更为高效的方式,实现快速构建、数据编排、连接生态、中台服务等。通过少量代码或不用代码实现数字化转型中的场景应用创新。它能缓解甚至解决庞大的市场需求与传统的开发生产力引发的供需关系矛盾问题,是数字化转型过程中降本增效趋势下的产物。
这边介绍一款好用的低代码平台——JNPF快速开发平台。近年在市场表现和产品竞争力方面表现较为突出,采用的是最新主流前后分离框架(SpringBoot+Mybatis-plus+Ant-Design+Vue3)。代码生成器依赖性低,灵活的扩展能力,可灵活实现二次开发。
以JNPF为代表的企业级低代码平台为了支撑更高技术要求的应用开发,从数据库建模、Web API构建到页面设计,与传统软件开发几乎没有差异,只是通过低代码可视化模式,减少了构建“增删改查”功能的重复劳动,还没有了解过低代码的伙伴可以尝试了解一下。
应用:https://www.jnpfsoft.com/?csdn
有了它,开发人员在开发过程中就可以轻松上手,充分利用传统开发模式下积累的经验。所以低代码平台对于程序员来说,有着很大帮助