Quelles données sont effectivement stockées dans une base de données B-tree en CouchDB?
-
28-09-2019 - |
Question
Je me demande ce qui est réellement stocké dans une base de données CouchDB B-tree? CouchDB: The Definitive Guide indique que la base de données est utilisé B-tree pour les opérations de append seule et que une base de données est stockée dans un seul B-tree (en plus de B-arbres à la carte).
Je suppose que les éléments de données qui sont ajoutées au fichier de base de données sont révisions des documents, et non l'ensemble des documents:
+---------|### ...
| |
+------|###|------+ ... ---+
| | | |
+------+ +------+ +------+ +------+
| doc1 | | doc2 | | doc1 | ... | doc1 |
| rev1 | | rev1 | | rev2 | | rev7 |
+------+ +------+ +------+ +------+
Est-il vrai?
Si elle true, alors comment la révision en cours d'un document est déterminé sur la base d'un tel B-tree?
ne pas dire, que CouchDB a besoin d'une base de données "vue" séparée pour l'indexation révisions de documents à conserver O (log n) accès? Ne serait-il conduire à des conditions de course tout en construisant un tel indice? (Pour autant que je sache, CouchDB utilise pas de verrou en écriture).
La solution
Le fichier de base de données sur le disque est append seule; mais le B-tree est modifié sur le plan conceptuel en place. Lorsque vous mettez à jour un document,
- Son nœud feuille est écrit (via append dans le fichier DB)
- Son nœud parent est réécrite pour faire référence à la nouvelle feuille (via append bien sûr)
- Répétez l'étape 2 jusqu'à ce que vous mettez à jour le nœud racine
Lorsque le nœud racine est écrit, qui est effectivement lorsque la version plus récente est « engagée ». Pour trouver un document, vous commencez à la fin du fichier, obtenir le nœud racine, et travailler jusqu'à votre ID doc. La dernière révision sera toujours accessible ainsi.
Autres conseils
CouchDB ne stocke pas diffs. Lorsque vous mettez à jour un document, il ajoute le tout nouveau document avec un nouveau _rev et même _id que l'ancienne version. L'ancienne version est supprimée lors du compactage.