1

que j'ai un "message" table avec 2 index secondaires: tableComment gérez-vous les index de dénormalisation/secondaires dans le sharding de base de données?

  • "recipient_id"
  • "sender_id"

Je veux shard le "message" par "recipient_id". De cette façon, pour récupérer tous les messages envoyés à un certain destinataire, j'ai seulement besoin d'interroger un fragment.

Mais en même temps, je veux être en mesure de faire une requête qui demande tous les messages envoyés par un certain expéditeur. Maintenant, je ne veux pas envoyer cette requête à chaque fragment de la table "message". Une façon de procéder est de dupliquer les données et d'avoir une table "message_by_sender" partagée par "sender_id". Le problème avec cette approche est que chaque fois qu'un message a été envoyé, j'ai besoin d'insérer le message dans les deux tables "message" et "message_by_sender". Mais si après insertion dans "message" l'insertion dans "message_by_sender" échoue? Dans ce cas, le message existe dans "message" mais pas dans "message_by_sender".

Comment puis-je m'assurer que si un message existe dans "message" alors il existe aussi dans "message_by_sender" sans recourir à la validation en 2 phases?

Cela doit être un problème très commun pour toute personne qui partitionne ses bases de données. Comment gérez-vous cela?

Répondre

1

Il n'y a pas de "solution miracle" à ce problème. Certaines options:

  1. Utilisez une file d'attente de messages pour publier les modifications. Finalement, les changements le rendraient aux différentes partitions.
  2. Avoir un déclencheur sur les partitions de table de messages qui créent une ligne «entrée d'index nécessaire» dans une table. Quelque chose d'autre serait périodiquement analyser cela et créer l'index.

Vous souhaiterez peut-être lire cet article de blog relatif à la réalisation de transactions distribuées sur Google App Engine: http://blog.notdot.net/2009/9/Distributed-Transactions-on-App-Engine. Fondamentalement, si vous ne voulez pas 2phase commit ou Paxos ou quelque chose comme ça, alors vous devez vivre avec une sorte de modèle finalement cohérent.

-Dave