Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何处理数据库分片中的非规范化/二级索引?_Database_Scalability_Denormalization_Sharding_Distributed Transactions - Fatal编程技术网

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

Database 如何处理数据库分片中的非规范化/二级索引?,database,scalability,denormalization,sharding,distributed-transactions,Database,Scalability,Denormalization,Sharding,Distributed Transactions,假设我有一个带有2个二级索引的“消息”表: “收件人id” “发件人\u id” 我想按“收件人id”切分“邮件”表。这样,要检索发送给某个收件人的所有消息,我只需要查询一个碎片 但同时,我希望能够查询某个发送者发送的所有消息。现在,我不想将该查询发送到“message”表的每个碎片。一种方法是复制数据,并用“发送者id”切分“message\u by\u sender”表 这种方法的问题是,每次发送消息时,我都需要将消息插入“message”和“message\u by\u sender”

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

  • “收件人id”
  • “发件人\u id”
我想按“收件人id”切分“邮件”表。这样,要检索发送给某个收件人的所有消息,我只需要查询一个碎片

但同时,我希望能够查询某个发送者发送的所有消息。现在,我不想将该查询发送到“message”表的每个碎片。一种方法是复制数据,并用“发送者id”切分“message\u by\u sender”表

这种方法的问题是,每次发送消息时,我都需要将消息插入“message”和“message\u by\u sender”表中

但是,如果在插入“消息”之后,插入“消息发送者”失败了怎么办?在这种情况下,消息存在于“message”中,但不存在于“message\u by\u sender”中

如何确保如果消息存在于“message”中,那么它也存在于“message\u by\u sender”中,而不必求助于2阶段提交

这对于任何破坏数据库的人来说都是一个非常常见的问题。你如何处理它?

这个问题没有“灵丹妙药”。一些选择:

  • 使用消息队列发布更改。最终,这些更改将使它成为不同的分区
  • 在消息表分区上有一个触发器,用于在表中创建“需要索引项”行。其他的东西会定期扫描并创建索引
  • 您可能想阅读以下关于在Google App Engine上执行分布式事务的博客条目:。基本上,如果您不想要2phase commit或Paxos之类的东西,那么您需要使用某种最终一致的模型

    -戴夫

    这个问题没有“灵丹妙药”。一些选择:

  • 使用消息队列发布更改。最终,这些更改将使它成为不同的分区
  • 在消息表分区上有一个触发器,用于在表中创建“需要索引项”行。其他的东西会定期扫描并创建索引
  • 您可能想阅读以下关于在Google App Engine上执行分布式事务的博客条目:。基本上,如果您不想要2phase commit或Paxos之类的东西,那么您需要使用某种最终一致的模型

    -戴夫