Ayant déjà lu plusieurs questions sur SO, les articles de blog externes et le manuel
- SO : contrainte de clé étrangère sur la table partitionnée en Pg
- dba.SE : Différentes façons de gérer FK vers une table partitionnée dans Pg
- Manuel : héritage
- Manuel : partitionnement
- Manuel : déclencheurs de contraintes
- Blog : Modélisation Postgres avec héritage
Je me demande toujours si je dois ou non opter pour le partitionnement.
Le cas - simplifié
Stockage des données client. Tous les noms des tableaux mentionnés ci-dessous sont faits pour plus de clarté.
Avoir des objets identifiables par le client et des êtres non physiques, ainsi que leurs objets physiques dans lesquels ils sont réellement stockés en cas de besoin de renvoyer certains objets au client à la demande, ou de les traiter d'une autre manière. Ils sont cartographiés dans une relation plusieurs-à-plusieurs.
objects_nonphysical
,objects_physical
,objects_mapping_table
.La deuxième relation plusieurs-à-plusieurs se situe entre ces objets non physiques et leurs mesures. Certains objets sont liés à certaines métriques.
metrics
,metrics_objects_nonphysical
Les objets non physiques et physiques ont leurs tables de hiérarchie qui sont des relations enfant-parent.
objects_nonphysical_hierarchy
,objects_physical_hierarchy
Selon les besoins et les exigences de chaque client, les données sur les objets physiques peuvent être fournies ou peuvent devoir être créées à partir de zéro. Fondamentalement, ce que je dois faire, c'est:
Maintenir le système interne pour les déclarations rapides
INSERT
etSELECT
, car c'est ici que le mappage va avoir lieu.Maintenir le système pour que le client externe puisse visualiser et opérer sur ses objets non physiques - récupération rapide des données. Fort besoin d'efficacité pour les
SELECT
relevés - ces données sont disponibles pour de nombreux clients à rechercher quand ils le souhaitent.
Ma considération
Il peut y avoir un client, qui peut accéder aux données, les visualiser et les exploiter, mais cela n'a pas besoin d'être un entrepreneur pour lequel nous avons obtenu les données de / traitons les données pour.
Cela m'a amené à introduire le partitionnement de table dans mon système, étant donné que je sais toujours dans quelles données de partition doit tomber ( partitionnement pour les sous-traitants ), puis à maintenir le système pour le client externe là où j'ai besoin de partitionner pour les clients (cela se ferait avec certains retarder l'utilisation d'outils d'automatisation et d'un ensemble de règles pour réécrire les données à la manière des clients, de sorte que pour chaque client, nous n'analysions qu'une seule partition pour chaque table.
Volume de données
Mes données vont croître constamment, en particulier lors de l'importation d'objets et de métriques de nouveaux clients. Le rythme des nouvelles données arrivant dans le système est actuellement imprévisible à long terme. Il n'y a vraiment aucun moyen de le mesurer sans savoir qui sera le prochain client. À l'heure actuelle, il n'y a que 2 clients avec plus ou moins 1 million de lignes pour chaque client dans chaque table. Mais à l'avenir, je prédis que de nouveaux clients viendront avec un volume de 10 millions de lignes environ.
Des questions
Ces questions sont toutes liées les unes aux autres.
- Le partitionnement doit-il vraiment être considéré ici, ou est-ce une exagération? Je le considère utile car je scanne toujours exactement une partition.
- Si le partitionnement est la voie à suivre, comment puis-je appliquer la
FK
contrainte le plus efficacement compte tenu de mes besoins? Dois-je opter pourconstraint triggers
, ou simplement le conserver dans la couche application pour le système interne, ou peut-être une autre méthode? - Si le partitionnement n'est pas la voie à suivre, dans quoi dois-je plonger?
S'il n'y a pas suffisamment de données fournies, veuillez me le faire savoir dans les commentaires ci-dessous.