架构设计(数据层)


架构设计(数据层)

          

              

                           

关系数据库

        

关系数据库:需要事先定义表,读写数据时,表中字段不可动态变更

                 架构设计(数据层)_第1张图片

表中的每个行记录代表一个关系:(1,海贼王,20)、(2,瓜田李下,20)
表与表之间也可建立关联关系:一对一、一对多、多对一、多对多
关系型数据库进行读写操作时,一般都是在事务(transaction)中进行,需要保证数据的一致性

            

应用场景:复杂的业务数据、一致性可靠性要求比较高的业务数据

常用关系型数据库:mysql、sql server、oracle

        

                    

                           

非关系数据库

        

关系数据库:不需要事先定义表,读写数据时,表中字段可动态变更

                 架构设计(数据层)_第2张图片

# 数据以key:value键值对的形式存储
{"id":"1","name":"海贼王","age":"20"}
{"id":"2","name":"瓜田李下","age":"20"}

# 表中字段可动态拓展,表中记录的字段可不相同
{"id":"1","name":"海贼王","age":"20"}
{"id":"1","name":"海贼王","age":"20","school":"hzw"}

表与表之间一般没有关联关系,读写速度较关系型数据库快

           

应用场景:可靠性要求不高的数据、数据结构需要动态拓展的数据

常用非关系型数据库:mongoDB、dynamoDB、redis、elasticsearch

        

                  

                           

分库分表

      

数据量很大、数据服务器读写性能很慢时,可以考虑使用分库分表

分库:将一个数据库中的数据分散存储到多个数据库中

分表:将原来一张表的数据分散存储到多个的表中

         

垂直分库:将数据库中的表按业务划分,存到不同的数据库中

垂直分表:将表中字段拆分(如按照使用频率),存放到不同的表中

                 架构设计(数据层)_第3张图片

                

水平分片:将数据按照某种规则分散存储到不同的数据库(表)中

                 架构设计(数据层)_第4张图片

      

分库分表带来的问题

数据拆分后数据比较凌乱,需要知道从哪个库的哪各表中获取数据;
分库分表后,数据的分页、排序、分组聚合等操作较单表复杂;
分库分表后,涉及到分布式事务,需要保证数据的一致性

         

sharding jdbc:https://shardingsphere.apache.org/document/current/cn/overview/

sharding jdbc功能:分库分表、读写分离等
分库分表后,sql语句会有一些使用限制,详见官网
分布式事务:local、XA、柔性事务(集成seata实现)

                 架构设计(数据层)_第5张图片

      

                

                           

读写分离

      

数据读写比较频繁,服务器压力较大时,可以考虑使用读写分离(写主库读从库)

                 架构设计(数据层)_第6张图片

           

读写分离带来的问题

# 数据一致性
主从数据库之间的数据存在延时,如果对数据一致性要求较高,应该直接读主库

# 考虑使用缓存替代读写分离
使用读写分离,从数据库需要很多额外的空间,可使用缓存存储频繁访问的数据

        

              

你可能感兴趣的:(架构设计,架构设计)