Avendo già letto diverse domande su SO, post di blog esterni e manuali
- SO : vincolo di chiave esterna alla tabella partizionata in pag
- dba.SE : modi diversi di gestire FK nella tabella partizionata in pag
- Manuale : ereditarietà
- Manuale : partizionamento
- Manuale : trigger di vincolo
- Blog : Postgres che modella con eredità
Mi trovo ancora a chiedermi se dovrei andare con il partizionamento considerando il mio caso o meno.
Il caso - semplificato
Archiviazione dei dati dei clienti. Tutti i nomi delle tabelle menzionate di seguito sono fatti per chiarezza.
Avere oggetti che sono identificabili dal cliente e sono esseri non fisici, anche i loro oggetti fisici in cui sono effettivamente archiviati nel caso in cui sia necessario rispedire alcuni oggetti al cliente su richiesta o elaborarli in altri modi. Sono mappati in una relazione molti-a-molti.
objects_nonphysical
,objects_physical
,objects_mapping_table
.La seconda relazione molti-a-molti è tra quegli oggetti non fisici e le loro metriche. Ci sono oggetti che sono legati con alcune metriche.
metrics
,metrics_objects_nonphysical
Sia gli oggetti non fisici che quelli fisici hanno le loro tabelle gerarchiche che sono relazioni figlio-genitore.
objects_nonphysical_hierarchy
,objects_physical_hierarchy
A seconda delle esigenze e dei requisiti di ciascun cliente, i dati sugli oggetti fisici possono essere forniti o potrebbero essere creati da zero. Fondamentalmente, ciò che devo fare è:
Mantenere il sistema interno per veloce
INSERT
eSELECT
dichiarazioni, perché qui è dove si svolgerà la mappatura.Mantenere il sistema affinché i clienti esterni possano visualizzare e operare sui loro oggetti non fisici - recupero rapido dei dati. Forte necessità di efficienza per le
SELECT
dichiarazioni: questi dati sono disponibili per molti clienti per effettuare ricerche in qualsiasi momento.
La mia considerazione
Può esserci un cliente, che può accedere ai dati, visualizzarli e gestirli, ma non è necessario che sia un appaltatore per il quale abbiamo ottenuto i dati / per i quali li stiamo elaborando.
Questo mi ha portato a introdurre il partizionamento delle tabelle nel mio sistema, considerando che so sempre in quali dati di partizione dovrebbero rientrare (il partizionamento per gli appaltatori ) e quindi al sistema principale per i clienti esterni dove ho bisogno di partizionare per i clienti (questo sarebbe fatto con alcuni ritardare l'uso di strumenti di automazione e un insieme di regole per riscrivere i dati in modo clienti, in modo che per ogni cliente si esegua la scansione di una sola partizione per ogni tabella.
Volume di dati
I miei dati cresceranno costantemente, soprattutto durante l'importazione di oggetti e metriche di nuovi clienti. Il ritmo dei nuovi dati che arrivano nel sistema è imprevedibile al momento a lungo termine. Non c'è davvero modo di misurarlo non sapendo chi sarà il prossimo cliente. Al momento ci sono solo 2 clienti con più o meno 1 milione di righe per ogni cliente in ogni tabella. Ma in futuro prevedo che anche i nuovi clienti avranno un volume di circa 10 milioni di righe.
Domande
Queste domande sono tutte correlate tra loro.
- Il partizionamento dovrebbe davvero essere preso in considerazione qui o è eccessivo? Lo considero utile poiché eseguo sempre la scansione esattamente di una partizione.
- Se il partizionamento è la strada da percorrere, come posso applicare il
FK
vincolo nel modo più efficace considerando le mie esigenze? Dovrei andare perconstraint triggers
, o semplicemente tenerlo nel livello applicazione per il sistema interno, o forse qualche altro metodo? - Se il partizionamento non è la strada da percorrere, in cosa dovrei tuffarmi?
Se non ci sono abbastanza dati forniti, per favore fatemi sapere nei commenti qui sotto.