第5章 数据访问层

5.1 数据库从单机到分布式的挑战和应对
5.1.1 从应用使用单机数据库开始
我们基于java技术构建网站,使用JDBC方式来连接数据库。

5.1.2 数据库垂直/水平拆分的困难
数据拆分有两种方式,一个是垂直拆分,一个是水平拆分。垂直拆分就是把一个数据库中不同业务单元的书分到不同的数据库里面,水平拆分是根据一定的规则把同一业务单元的数据拆分到多个数据库中。无论是垂直拆分还是水平拆分,最后的结果都是将原来在一个数据库中的数据拆分到了不同的数据库中,所以原来单机数据库可以支持的特性现在就未必支持了。
垂直拆分带来如下影响:
  • 单机的ACID保证被打破了。数据到了多机后,原来在单机通过事务来进行的处理逻辑会受到很大的影响。我们面临的选择是,要么放弃原来的单机事务,修改实现,要么引入分布式事务。
  • 一些join操作会变得比较困难,因为数据可能已经在两个数据库中,所以不能很方便地利用数据库自身的join了,需要应用或者其他方式来解决。
  • 靠外键去进行约束的场景会受影响。
水平拆分会带来如下影响:
  • 同样有可能有ACID被打破的情况。
  • 同样有可能有join操作被影响的情况。
  • 靠外键去进行约束的场景会有影响。
  • 依赖单库的自增序列生成唯一ID会受影响。
  • 针对单个逻辑意义上的表的查询要跨库了。
5.1.4 多机的Sequence问题与处理





5.1.5 应对多机的数据查询
5.1.5.1 跨库join
解决的思路有如下:
  • 在应用层把原来数据库的join操作分成多次的数据库操作。举个例子,我们有用户基本信息的数据表,也有用户出售的商品的信息表,需求是查出来登记手机号138XXXXXXXX的用户在售的商品总数。这在单库时用一个SQL的join就解决了,而如果商品信息与用户信息分开了,我们就需要先在应用层根据手机号找到用户id,然后再根据用户id找到相关的商品总数。
  • 数据冗余,也就是对一些常用信息进行冗余,这样就可以把原来需要join的操作变为单表查询。这需要结合具体业务场景。
  • 借助外部系统(例如搜索引擎)解决一些跨库的问题。
5.1.5.3 跨库查询的问题及解决






5.2.1 如何对外提供数据访问层的功能


总结

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务