6

Nel mio lavoro, ho spesso due tabelle nei miei modelli django e devo collegarle per restituire questi dati come un csv ad esempio. Questi dati non sono collegati da una chiave esterna, ma hanno un identificatore per collegarli. Ciò deriva dal fatto che importiamo questi dati da due fonti diverse e a volte manca la controparte, quindi non riesco a collegarlo durante la creazione della voce.Ottimizzazione delle prestazioni per il collegamento dei dati nei modelli django

La mia domanda è: qual è il modo migliore per collegare questi dati in termini di prestazioni se si pensa al fatto che spesso devo restituire questi dati?

  1. Modo: Creare un nuovo modello che colleghi i dati (come un m2m) o la classe padre con l'identificatore, a cui entrambi sono connessi.
class OrderInvoiceConnector(models.Model): 
    order_data = models.ForeignKey(Order, related_name="invoice") 
    invoice_data = models.ForeignKey(Invoice, related_name="order") 
  1. Way: Creare un nuovo modello che salva solo i dati che è necessario per l'esportazione csv. Qualcosa di simile:
class ConnectedData(models.Model): 
    invoice_id = models.CharField(max_length=255) 
    country_iso = models.CharField(max_length=255) 
    invoice_date = models.CharField(max_length=255) 
    tax = models.FloatField(max_length=255) 
    price = models.FloatField() 
+0

È difficile dare una risposta corretta sotto ma cercherò di commentare ciò che farei e forse potrebbe essere utile ma dipende da alcune cose. Se l'utente è in attesa del download di un file CSV probabilmente andrò con l'opzione 2, ma tutto dipende dalla frequenza con cui i dati cambiano e quanto tempo impiega generare. Alcune volte al giorno con piccole quantità di dati è OK. Inoltre, se questo CSV non è personalizzabile nel progetto django da parte dell'utente, penserei a generare il CSV prima che l'utente lo richieda. Altrimenti la tua prima opzione. Detto questo, questo dipende da molte cose. –

+0

Potresti fornire un po 'più di informazioni su quale sia il problema di prestazioni? Il join del DB richiede alcuni secondi/minuti/ore. Se l'utente sta aspettando questo? Quanto spesso cambiano i dati? –

+0

I dati cambiano una volta al giorno a destra. L'utente sarà in grado di scaricare csv da un normale sito Web, con opzioni di filtro (ad es. Filtro per data). Il join richiede 2 ore per 150.000 set di dati su ciascun sito. –

risposta

1

vorrei andare con la seconda variante, come lei ha ricordato che l'adesione sarebbe costoso, e le modifiche dei dati vengono prodotti su base giornaliera. Se crei un modello di sola lettura, impacchetterai tutti i dati richiesti per il consumo degli utenti in una singola query di tabella. Dovresti popolare i dati con un lavoro automatico, ma ciò sembra accettabile nel tuo scenario menzionato.

Problemi correlati