Bonjour à tous,
Je développe un site dont le système est plus au moins similaire à disqus (système de commentaires avec pagination des commentaires)
Schématiquement:
une table item (plusieurs millions)
une table user (plusieurs millions)
une table comments (plusieurs millions) <== c'est là que je m'interroge
(mon environnement : PostgreSQL 9.1 + JPA Hibernate)
Je me demandais quelle pouvait être la meilleurs manière de persister en DB les informations de l'arbre des commentaires.
D'après ce lien:
Models for hierarchical data
Il existe 4 manières différentes de faire :
1 - "adjacency liste" : le plus commun, chaque noeud contient l'id de son parent
2 - "path énumération" : les chemins matérialisés
3 - nested set : arbre par représentation intervallaire
4 - closure table
5 - recursive CTE
Pour le 1 : cela implique des sous requêtes complexes et non performantes
Pour le 2 : ca me semble bien mais je crains que les requêtes sur des path avec des like % soit couteux
pour le 3 : l'idée est bonne mais dès que tu ajoutes un nœud il faut recalculer tous les autres, je pense que c'est une mauvaise idée pour des tables volumineuses et dont les insertions sont fréquentes (je table sur des millions de rows)
pour le 4 : ça semble idéal mais il y a peu de retour utilisateur et c'est surtout l'auteur de ce pattern qui en fait l'éloge donc j'ai des doutes (d'autant que j'ai l'impression que cette technique peut devenir très consommatrice en terme d'espace disque si l'arborescence est profonde)
pour le 5 : je sais que PostgreSQL supporte ça mais je ne pense pas que ça s'interface facilement avec Hibernate.
Je sais que d'autres solutions dérivées du nested set existent mais je n'ai pas la compétence pour juger de leur intérêt dans mon cas (entre autre : Nested Intervals Tree Encoding with Continued Fractions qui semble bien mais assez complexe à mettre en œuvre)
Bref, je ne sais pas quelle solution choisir parmi les 4 (même si je penche pour la 2 et la 4)
N'importe laquelle des solutions pourrait aller mais je dois choisir celle qui assure les meilleurs performances (table énorme et sollicitations très fréquentes) et une bonne maintenabilité.
vos avis et retours d'expériences sont les bienvenus
Merci
Partager