【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 数据库配置表

id ip port database user password create_time update_time
1 127.0.0.1 3306 qphp_db_01 root 123456 1232132101 123123231202
2 127.0.0.1 3306 qphp_db_02 root 123456 1232132101 123123231202
3 127.0.0.1 3306 qphp_db_03 root 123456 1232132101 123123231202
4 127.0.0.2 3306 qphp_db_04 root 123456 1232132101 123123231202
5 127.0.0.2 3306 qphp_db_05 root 123456 1232132101 123123231202
6 127.0.0.2 3306 qphp_db_06 root 123456 1232132101 123123231202
7 127.0.0.3 3306 qphp_db_07 root 123456 1232132101 123123231202
8 127.0.0.3 3306 qphp_db_08 root 123456 1232132101 123123231202
9 127.0.0.3 3306 qphp_db_09 root 123456 1232132101 123123231202

2.2、sys_table_conf 数据库表的配置表

id table_name shard_rule create_time update_time
1 q_user 10 1232132101 123123231202
2 q_goods商家商品表 100 1232132101 123123231202
3 q_business_order商家订单表,订单id与消费者订单表订单id相同 100 1232132101 123123231202
3 q_consumer _order消费者订单表,订单id与商家订单表订单id相同 100 1232132101 123123231202
4 q_order_goods_info订单详细表 100 1232132101 123123231202
5 q_address 20 1232132101 123123231202
订单分为商家订单表,消费者订单表是冗余数据

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用户表设计

id user_name password is_business_state create_time update_time
1 mumu 123456 1:普通用户2:商家 1232132101 123123231202
2 mumu1 123456 1:普通用户2:商家 1232132101 123123231202
3 mumu2 123456 1:普通用户2:商家 1232132101 123123231202

q_order_01用户表设计(不需要)

id order_sn business_uid consumer_uid order_status total_amount create_time update_time
1 O000001 0001 01 1:未付2:已付3:已完成4:申请退款5:已退款 99.01 123123231202 123123231202
2 O000002 0002 02 1:未付2:已付3:已完成4:申请退款5:已退款 10.01 123123231202 123123231202
3 O000003 0003 03 1:未付2:已付3:已完成4:申请退款5:已退款 17.99 123123231202 123123231202

q_business_order_01用户表设计

order_id order_sn business_uid order_status total_amount create_time update_time
001 O000001 2 1:未付2:已付3:已完成4:申请退款5:已退款 99.01 123123231202 123123231202
002 O000002 2 1:未付2:已付3:已完成4:申请退款5:已退款 99.01 123123231202 123123231202
003 O000003 1 1:未付2:已付3:已完成4:申请退款5:已退款 99.01 123123231202 123123231202

q_consumer _order_01用户表设计

order_id order_sn consumer_uid order_status total_amount create_time update_time
001 O000001 2 1:未付2:已付3:已完成4:申请退款5:已退款 99.01 123123231202 123123231202
002 O000002 2 1:未付2:已付3:已完成4:申请退款5:已退款 99.01 123123231202 123123231202
003 O000003 1 1:未付2:已付3:已完成4:申请退款5:已退款 99.01 123123231202 123123231202

用户分布式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_order1–q_order100

5.1为了解决商家扫描全库全表:

5.1.1、订单分为商家订单表,消费者订单表是冗余数据

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

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

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

5.1.3、商家订单表,消费者订单表之间状态同步使用消息对列MQ

修改订单表每次同时修改q_business_order,q_consumer _order,最好采用异步的方式,mq。

5.2、q_order_goods_info表最好以q_order的订单id做分片,点订单好在查询一次详情,效率最好,如果使用用户id无论商家还是消费者,查询都要做相应的取舍

你可能感兴趣的:(BigData,工作笔记,数据库架构,mysql)