假设我有一个带有 2 个二级索引的“消息”表:
- “收件人 ID”
- “发件人ID”
我想按“recipient_id”对“消息”表进行分片。通过这种方式检索发送给某个收件人的所有消息,我只需要查询一个分片。
但同时,我希望能够进行查询,询问某个发件人发送的所有消息。现在我不想将该查询发送到“消息”表的每个分片。一种方法是复制数据并有一个由“sender_id”分片的“message_by_sender”表。
这种方法的问题在于,每次发送消息时,我都需要将消息插入“message”和“message_by_sender”表中。
但是如果在插入“message”之后插入“message_by_sender”失败了怎么办?在这种情况下,消息存在于“message”中,但不存在于“message_by_sender”中。
我如何确保如果一条消息存在于“消息”中,那么它也存在于“message_by_sender”中而不诉诸两阶段提交?
对于任何对其数据库进行分片的人来说,这一定是一个非常普遍的问题。你怎么处理它?