导语:随着云上应用的迅速发展,DT时代的到来,面对数智化、多场景情况下,我们如何做好数据库选型?
近年来应用上云、数字化转型的升级,数据沉淀的规模呈现爆发式增长,数据问题治理和分析以实现数据价值,数据库作为数据承载力的基石,多种数据库产品应运而生,我们需要根据不同的应用场景选择更适合我们的数据库产品。
进行数据库的选型,主要需要考虑两个方面:业务侧的应用功能需求、运维侧的架构需求
业务多场景化,比如:电商、金融、游戏等用户行业,存储的商品及订单信息、交易数据、游戏储值数据等信息,不同业务对数据结构、未来设计和扩展的需求,决定了我们是选择关系型数据库还是非关系型数据库
运维侧主要考虑数据库的性能及数据库架构扩展能力是否能满足对业务侧快速发展迭代对数据库存储、性能、扩展方面的需求
在寻找数据库的过程中,我们首先应该关注的是广度,给大家推荐一个专门收集和呈现数据库管理系统信息的数据库引擎排名站点DB-engines,在业内,对数据库的通用分类主要包括5大类:
业务应用系统可以按照交易类型分为联机事务处理过程OLTP(On-Line Transaction Processing)和联机实时分析OLAP(On-Line Analytical Processing)两大场景,混合事务和分析处理HTAP(Hybrid Transaction and Analytical Process)打破两者的隔阂,既可以应用于事务型数据库场景,也可以应用于分析型数据库场景,实现实时业务决策。因此我们应该在选择数据库分类的基础上,需要进一步具体到某一款数据库,需要考虑一些数据库特点:
OLTP类型的数据库提供事务能力,严格满足ACID特性,实时性要求较高;而OLAP类型数据库支持强大的汇聚分析能力,可能不支持事务,一般情况下实时性会差一些。
随着数据库技术的不断发展,关系型数据库与非关系型数据库界限逐渐模糊,较多关系型数据库已经支持JSON数据格式,避免一些特定场景需要手动编解码,但并不意味着它是万能的,放松对数据格式和模型的设计,把关系型数据库当作文档数据库使用时错误的
我们不仅需要关注查询分析响应速度,还要关注业务相关维度,比如:聚合分析支持的并发、支持的读写能力等,事务型在关注读写并发能力的同时也需要关注在数据分析上的性能表现
文档数据库由于灵活的数据结构受到众多开发者的亲睐,如:Mongodb、ES等,经常作为业务核心数据库使用,然后因为灵活方便反而容易被滥用,我们使用文档型数据库时应注意:
由于文档数据库支持复杂JSON的结构,导致在使用过程中不对数据模型进行抽象,导致数据库中保存了很多冗余信息,不仅占用额外的磁盘空间,也导致数据库建立索引和聚合分析性能开销变大
文档数据库一般不支持多文档事务,仅保证单文档变更原子性,避免依赖文档数据库的结构灵活性而忽略业务事务型的诉求,导致最后业务代码实现越来越复杂,稳定性与性能都会越来越差
mongoDB针对单文档操作有非常不错的性能,不同语言也都有成熟的SDK支撑,但不能因为修改方便,频繁的进行文档修改操作,大量的修改操作叠加在一起性能开销会被放大
Redis作为常用的Key-Value型数据库以缓存的方式应用于服务中,不过当我们不需要在多个服务器间进行共享时,其实没有必要单独建立Redis数据库进行cache,很多语言本身就有成熟的内存cache库可以使用,这样可以避免每次访问都会有网络开销
时序数据库主要用于记录监控数据,如:prometheus、druid等,有些典型的特点:
云计算时代,大量的应用上云,自然而然更多的云数据库应运而生,选择云平台数据库的一些好处:
现在日益复杂的业务场景及分布式情况下,通常我们会同时使用多种数据库,比如:可能会在将一些热点数据存储在Redis中,将业务数据拆解成行列二维表存储在Mysql中,将一些全文搜索的数据放在ES中,将一些日志数据或者文档数据放在MongoDB中等等,面对NoSQL数据库与关系型数据库该如何抉择
关系型数据库对业务层开发效率有很大帮助,我们通过一个简单案例解释一下,上班期间我们需要通过打卡考勤,通过关系型新建员工、考勤机、考勤记录三张表,如下图:
在关系数据库中,表中的每行数据由多个从属列的单一值(比如数字、字符串)构成,虽然表中可以存放任意行数据,但列却是定义且不变的,因此我们很容易通过行、列交汇处的单一值进行关联操作,完成各类业务目的的查询统计,比如:业务开发者可以通过下面这行SQL语句,找到在某天打卡的员工,上报其员工ID以及所在打卡的考勤机
SELECT
e.name,r.record_time,m.location
FROM records as r
JOIN machines as m on m.id=r.machine_id
JOIN employees as e on e.id=r.employee_id
WHERE r.record_time='20220626'
运营人员可以通过下面SQL语句,统计各考勤机的使用频率
SELECT
m.id,count(*) as nums
FROM machines as m
JOIN records as r on r.machine_id=m.id
GROUP BY m.id
因此,关系型数据库可以通过预定义的关系,由数据库本身完成复杂的逻辑计算,为不同的场景提供数据服务,通过事务来保证相关数据间的一致性
虽然基于单一值的映射关系提供了事务等许多功能,但也引入了几个问题:
NoSQL数据库放弃了与分布式环境相悖的ACID事务,提供了另一种聚合数据模型,从而拥有可伸缩的非关系型数据库,NoSQL包含上述数据库分类中除了关系型数据库之外的4类数据库,NoSQL快速发展的原因:
因此,如果我们多个业务数据间互相关联,我们需要从多个不同的角度分析、计算,并且需要保持相关数据的一致性,那么关系型数据库较为合适,一旦数据行数达到亿级别以上,就需要放弃单一值结构,将单行数据聚合为复合结构,放在可以伸缩的NoSQL数据库,此时我们无法依赖NoSQL数据库提供ACID事务操作,只能基于二段式提交等算法在应用层代码中实现事务。
实际上,关系型数据库与非关系型数据库都有明显的优缺点,我们进行选型时可以从业务数据模型、访问方式、数据量等考量,结合具体的应用场景权衡取舍。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。