栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【sql】数据库分库分表设计方案(1)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【sql】数据库分库分表设计方案(1)

1.数据库分库分表设计(1)
2.数据库分库分表,实现分库分表后的分页查询,比如所有用户信息分页显示,用户表q_user_01–q_user_10

淘宝的做法是拆分买家库和卖家库,也就是两个库:买家库、卖家库。

买家库,按照用户的id来分库分表。卖家库,按照卖家的id来分库分表。

实际上是通过数据冗余解决的:一个订单,在买家库里面有,在卖家库里面也存储了一份。下订单的时候,要写两份数据。先把订单写入买家库里面去,然后通过消息中间件来同步订单数据到卖家库里面去。

买家库的订单a修改了后,要发异步消息,通知到卖家库去,更改状态。
————————————————

1、首先要有一个分布式id:

id:000000000001
id:000000000002
id:000000000003

2、元数据表:

sys_database_conf
sys_table_conf

2.1、sys_database_conf 数据库配置表
idipportdatabaseuserpasswordcreate_timeupdate_time
1127.0.0.13306qphp_db_01root1234561232132101123123231202
2127.0.0.13306qphp_db_02root1234561232132101123123231202
3127.0.0.13306qphp_db_03root1234561232132101123123231202
4127.0.0.23306qphp_db_04root1234561232132101123123231202
5127.0.0.23306qphp_db_05root1234561232132101123123231202
6127.0.0.23306qphp_db_06root1234561232132101123123231202
7127.0.0.33306qphp_db_07root1234561232132101123123231202
8127.0.0.33306qphp_db_08root1234561232132101123123231202
9127.0.0.33306qphp_db_09root1234561232132101123123231202
2.2、sys_table_conf 数据库表的配置表
idtable_nameshard_rulecreate_timeupdate_time
1q_user101232132101123123231202
2q_goods商家商品表1001232132101123123231202
3q_business_order商家订单表,订单id与消费者订单表订单id相同2001232132101123123231202
3q_consumer _order消费者订单表,订单id与商家订单表订单id相同2001232132101123123231202
4q_order_goods_info订单详细表2001232132101123123231202
5q_address201232132101123123231202
订单分为商家订单表,消费者订单表是冗余数据
3、分片规则 3.1、分布式id取一个注册的用户id

对用户分布式id进行取模
用户分布式id=9
要连接的主机数据库id=(分布式id%(sys_database_conf表条数))+1
要连接的主机数据库id=1 ,
sys_database_conf 表查询id等于1的主机信息,并连接数据库

3.2、127.0.0.1数据库qphp_db_01的表设计

q_user_01用户表设计

iduser_namepasswordis_business_statecreate_timeupdate_time
1mumu1234561:普通用户2:商家1232132101123123231202
2mumu11234561:普通用户2:商家1232132101123123231202
3mumu21234561:普通用户2:商家1232132101123123231202

q_business_order_01用户表设计

idorder_snbusiness_uidconsumer_uidorder_statustotal_amountcreate_timeupdate_time
1O0000010001011:未付2:已付3:已完成4:申请退款5:已退款99.01123123231202123123231202
2O0000020002021:未付2:已付3:已完成4:申请退款5:已退款10.01123123231202123123231202
3O0000030003031:未付2:已付3:已完成4:申请退款5:已退款17.99123123231202123123231202

用户分布式id=9
对用户分布式id进行取模
用户要插入的表id=(用户分布式id%(sys_table_conf表的q_user字段对应的shard_rule规则个数10))+1 = 10

要插入用户表:q_user_10

4、其他表都是用用户id进行分片,保证同一个用户的信息在同一张表内

用户分布式id=9
对用户分布式id进行取模
用户要插入的表id=(用户分布式id%(sys_table_conf表的q_goods ,q_address 字段对应的shard_rule规则个数10))+1 = 10

5、表q_order,q_order_goods_info 分片规则要做相应的取舍

q_order表有商家用户id,购买者用户id,
以购买者id做分片,购买者的订单在同一个分片表,方便购买者查询订单
商家用户id查询所有购买者下的订单,就要扫描全库全表q_order01-q_order100

5.1为了解决商家扫描全库全表: 5.1.1、订单分为商家订单表,消费者订单表是冗余数据

插入订单数据时,同时按商家id对数据库取模,获取所在数据库,
在按照商家id对q_business_order的规则200取模,获取所在的商家订单表,插入订单信息。

5.1.2、插入订单数据时,同时按消费者id对数据库取模,获取所在数据库,

在按照消费者id对q_consumer _order的规则200取模,获取所在的消费者订单表,插入订单信息。

5.1.3、商家订单表,消费者订单表之间状态同步使用消息对列MQ 5.2、q_order_goods_info表最好以q_order的订单id做分片,点订单好在查询一次详情,效率最好,如果使用用户id无论商家还是消费者,查询都要做相应的取舍
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/969809.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号