What
大学里面学习数据库的时候,要求都是要按照三范式设计。但是在互联网高并发大数据量的场景下,往往要反范式设计。
Why
因为反范式的好处是可以通过冗余存储来减少计算。
How
引入一个例子:订单业务举例
- 订单业务
Order(oid, info_detail)//订单主表
T(buyer_id, seller_id, oid)//买家,卖家关系表 - 数据量大怎么办?
水平切分 - 如何水平切分?如何满足查询?
Order -> oid
T -> buyer_id, seller_id?
订单主表很容易切分(对oid进行取模即可),可是关系表T怎么办,如果按照买家的话,买家的读问题(只需要读一个库)是解决了,可是卖家读问题(需要读取多个库)解决不了。 - 解决方案:冗余表
解决什么问题?
a. 数据量大
b. 需要水平切分
c. 一个schema上有多个字段的查询需求
怎么解决?-
数据库层面:
a. Order(oid, info_detail)
b. T1(buyer_id, seller_id, oid)//买家读取数据的时候读这个表
c. T2(seller_id, buyer_id, oid)//卖家读取数据的时候读这个表 -
服务层面:
方案一:服务同步冗余
方案二:服务异步冗余
-