求助!Sharding-JDBC分表字段的选择

42 阅读1分钟

有这样的业务表结构,Order表,下面有子订单OrderItem,一对多的关系。

在order支付之后,会生成ProductItem和ProductItemDetail。

OrderItem和ProductItem是一对一的关系,ProductItem和ProductItemDetail是一对多的关系。

到了ProductItemDetail,已经是一个个具体的商品了。

在生产过程中,会记录这个商品生产的实时节点ProductItemDetailNode,以及过程中出现的问题ProductItemDetailError,ProductItemDetail和他们俩的关系都是一对多。

现在ProductItemDetailNode的量比较大,一天15万左右。数据库中已有数据量1800万。所以考虑分表问题。

目前想法是对ProductItem、ProductItemDetail、ProductItemDetailNode、ProductItemDetailError根据年份进行分表,因为历史订单很少查询,只是以防万一需要查询。而且老板意思,即使这些数据不再用,也不让进行删除或者归档。

我的分表思路是根据ProductItem的主键进行雪花算法倒推出生成时间,来分片到指定年份表。

但这里就会有个问题,跨年的情况下,因为Order未支付,下单是在2025年,主键是2025年开头的,在2026年支付之后,新生成的ProductItem和ProductItemDetail主键是会划分到2026年的表,但是通过Order表和OrderItem表主键查询,会被分片到2025年,就会导致查不到数据。而且payDate只在Order表里,也不是查询的必填条件。

在线求助各位大佬,提供一下解决办法。

classDiagram
Order <|-- OrderItem
OrderItem <|-- ProductItem
ProductItem <|-- ProductItemDetail
ProductItemDetail <|-- ProductItemDetailError
ProductItemDetail <|-- ProductItemDetailNode
Order : +String id // 格式为年月日开头+随机字符串,比如20250521124556
Order : +String payDate
class OrderItem{
+String id // 雪花id
+String orderId
+String sku
+int quantity
}
class ProductItem{
+String id // 雪花id
+String orderId
+String orderItemId
+String sku
+int quantity
}
class ProductItemDetail{
+String id // 雪花id
+String orderId
+String orderItemId
+String productItemId
+String sku
+int quantity // 此处数量都是1
}
class ProductItemDetailError{
+String id // 雪花id
+String orderId
+String orderItemId
+String productItemId
+String productItemDetailId
+String error
}
class ProductItemDetailNode{
+String id // 雪花id
+String orderId
+String orderItemId
+String productItemId
+String productItemDetailId
+String node
}