Quelqu'un a souligné que mon architecture de structure de données est nulle.
J'ai un Emplacement: P> tags: p> si quelqu'un demande des informations sur le < Strong> Je cherche les meilleures performances de lecture! strong> Je m'en fiche de la performance d'écriture. Ces données ne sont pas changées très souvent. Et je me fiche de tailles de table non plus. Si j'ai besoin de plus ou plus grand tables pour résoudre ce type plus rapide, que ce soit. P> Je pense actuellement à la configuration de ces tables: p> Strong> p> olesteurs strong> p> j'ai ajouté un est-ce une bonne solution pour résoudre le problème ou y y a-t-il mieux? Je souhaite sélectionner aussi rapidement que possible toutes les étiquettes de tout endroit donné, y compris toutes les étiquettes de ses ancêtres. J'utilise une base de données PostgreSQL, mais je pense que c'est un problème d'architecture SQL pur. P> p> emplacements code> qui stocke le nom code> d'un emplacement. Ensuite, j'ai une table code> Tags qui stocke des informations sur les emplacements code>. Les emplacements code> ont une hiérarchie que je veux utiliser pour obtenir toutes les balises code>. P> Exemple h2>
mission ST code> Je veux livrer tout Tags code> de celui-ci et ses ancêtres ( ["" Anglais "," Sunny "," Côte ouest "," Side de la mer "," Station de téléphérique "] Code>. Si je demande tout < Code> Tags Code> de Californie Code> La réponse serait ["Anglais", "Sunny", "West Coast"] P> Les tables h2>
post ion code> champ pour stocker la hiérarchie. p> question h2>
3 Réponses :
Si vous souhaitez livrer toutes les balises pour un emplacement particulier, je vous recommanderais de reproduire les données et de stocker les balises dans une matrice de balises sur une rangée pour chaque emplacement. P>
Vous dites que les emplacements ne changent pas beaucoup. Donc, je serais simplement lot créer la totalité de la table, lorsque les données sous-jacentes changent. P>
Modification des données in situ em> est plutôt problématique. Une seule mise à jour pourrait finir par affecter une zillion différente des rangées - considérez un changement d'étiquette sur les États-Unis. Recalculer la table entière va être plus efficace. P>
Si vous avez besoin de rechercher sur les balises et de les renvoyer, j'irais une structure plus traditionnelle d'une table avec deux colonnes importantes, emplacement code> et étiquette code >. Ensuite, vous pouvez avoir des index sur les deux (emplacement) code> et (tag) code> pour faciliter la recherche dans les deux sens. P>
Si la performance d'écriture n'est pas cruciale, j'irais pour la dénormalisation de la base de données. Cela signifie que vous utilisez la structure ci-dessus pour vos opérations d'écriture et remplissez une table pour vos opérations de lecture par un déclencheur ou un travail asynchronisé, si vous avez peur des déclencheurs. Ensuite, les performances de lecture sont optimales, mais vous devez investir un peu plus dans la logique d'écriture. p>
L'utilisation de la structure ci-dessus pour les opérations de lecture n'est en effet pas une solution intelligente, car vous ne savez pas à quel point l'arbre peut être profond. P>
Votre problème semble composé de deux défis. Le plus intéressant est "Comment puis-je stocker des hiérarchies dans une base de données relationnelle". Il y a beaucoup de réponses à cela - celle que vous avez proposée est la plus courante. p>
Il y a une alternative appelée " Ensemble imbriqué " qui est plus rapide pour la lecture (dans votre exemple , Trouver tous les endroits dans une hiérarchie particulière serait "entre x et y". p>
postgres a Support dédié aux hiéraux ; Je suppose que cela fournirait également une grande performance. P>
La deuxième partie de votre question est "Compte tenu d'un chemin dans ma hiérarchie, récupérez toutes les balises correspondantes". L'option la plus simple consiste à joindre à la table des étiquettes comme vous le suggérez. P>
L'aspect final est "Devriez-vous désormaliser / précalculer". Je recommande généralement de construire et d'optimiser la solution "normalisée" et ne se dénormalise que lorsque vous devez. P>
Juste un commentaire sur l'extension LTREE. Nous l'avons laissé tomber en faveur d'une solution basée sur la dénormalisation, car elle devait ralentir pour nos grands ensembles de données. Mais je suis totalement d'accord avec vous, que Denom devrait être la dernière chose que vous considérez.