你如何处理数据库分片中的非规范化/二级索引?

时间:2010-05-02 03:14:59

标签: database scalability denormalization sharding distributed-transactions

假设我有一个带有2个二级索引的“消息”表:

  • “recipient_id”
  • “SENDER_ID”

我想通过“recipient_id”对“消息”表进行分片。这样检索发送给某个收件人的所有邮件我只需要查询一个分片。

但与此同时,我希望能够进行查询,询问某个发件人发送的所有邮件。现在我不想将该查询发送到“message”表的每个分片。一种方法是复制数据并使用“sender_id”分片的“message_by_sender”表。

该方法的问题在于,每次发送消息时,我都需要将消息插入“message”和“message_by_sender”表中。

但是如果在插入“message”后插入“message_by_sender”会失败怎么办?在这种情况下,消息存在于“消息”中,但不存在于“message_by_sender”中。

如何确保“消息”中存在消息,那么它也存在于“message_by_sender”中而不诉诸2阶段提交?

对于任何分片数据库的人来说,这一定是一个非常常见的问题。你怎么处理它呢?

1 个答案:

答案 0 :(得分:1)

这个问题没有“银弹”。一些选择:

  1. 使用消息队列发布更改。最终,更改将进入不同的分区。
  2. 在消息表分区上创建一个触发器,在表中创建“需要索引条目”行。其他东西会定期扫描并创建索引。
  3. 您可能希望阅读此博客文章,了解如何在Google App Engine上执行分布式事务:http://blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engine。基本上,如果您不想要2阶段提交或Paxos或类似的东西,那么您需要使用某种最终一致的模型。

    -Dave