Prestazioni dei dati principali con entity framework padre singolo

Sto creando un framework che funziona con Core Data. Uno dei requisiti per l’utilizzo del mio framework nella class Core Data è che qualsiasi quadro che si desidera avere le funzionalità del Framework dovrà essere sub entity framework e sottoclassi di un’ quadro che fornisco. Per il bene di ciò chiamerò quell’object Foo.

Oggi ho realizzato che Core Data memorizza tutti gli oggetti che sono sotto quadro di Foo in una tabella chiamata ZFOO. Sono preoccupato per le prestazioni dei Core Data se qualcuno con enormi set di dati vuole usarlo, dal momento che TUTTE le quadro secondarie della class foo saranno archiviate in una enorme tabella ZFOO.

Qualsiasi opinione o raccomandazione sarebbe molto apprezzata.

L’anno scorso ho lavorato su un progetto che ha fatto la stessa cosa, abbiamo archiviato tutto nei dati di base e tutto nei dati principali ereditati da una singola class che aveva alcuni attributi comuni.

Avevamo da qualche parte tra i record da 1k a 10k nei dati di base e le prestazioni degradate al punto in cui l’abbiamo riscritta e rimosso l’antenato comune. Ricordo che le ricerche semplici richiedevano più secondi e anche gli inserimenti / gli aggiornamenti erano davvero scadenti. È stato solo dopo che le cose sono diventate dolorosamente lente che abbiamo aperto il db e abbiamo notato che sotto i dati di copertina dei coperchi c’era tutto in un unico tavolo.

Scusa se non ricordo numeri specifici, il grande take-away era che dovevamo rifarlo perché era troppo lento, e non troppo lento come troppo lento per il trading ad alta frequenza, ma troppo lento come l’app si è schiantato sul carico quando si tenta di popolare l’iniziale visualizzare i dati principali.

Quindi, con il vantaggio che questo era su iOS più vecchi e vecchi hardware, direi sicuramente di non farlo.

Ho lavorato con @deathbob su questo progetto come lead per iOS. Nella nostra istanza ho avuto più classi che contenevano gli attributi “remote_id” e “remote_update”. Inizialmente ho impostato le tabelle usando sottoclassi. Avevo un’ quadro astratta “RemoteEntity” che conteneva quegli attributi e un gruppo di altre entity framework che ne ereditavano, ciascuna con il proprio. Ho pensato che avremmo finito con un mucchio di tabelle ciascuna con remote_id, remote_update e quindi i loro attributi personalizzati. Invece siamo finiti con il tavolo enorme che descrivi.

La soluzione era piuttosto semplice, non è necessario impostare l’ereditarietà tramite la GUI. Includere invece tutti gli attributi per quell’object, inclusi quelli condivisi nel modellatore Core Data (questo significa che “remote_id” e “remote_update” appariranno in ogni entity framework.) Detto questo possiamo ancora usare una sottoclass.Dopo aver generato le classi dei tuoi modelli, crea la class dell’entity framework padre, che non deve essere nella GUI. Dovrebbe ereditare da NSManagedObject e nel file .m le proprietà dovrebbero usare @dynamic invece di @synthesize. Ora che hai la class genitrice è tempo di regolare le classi figlio Imposta la class genitore su RemoteEntity (nel mio esempio) invece di NSManagedObject, quindi rimuovi tutte le proprietà che appaiono nella tua super class (nel mio esempio “remote_id” e “remote_update”).

Ecco un esempio della mia super class https://gist.github.com/1121689 .

Spero che questo aiuti, punta a @deathbob per averlo indicato.

Il senno di poi è una cosa meravigliosa.

Mentre le persone stanno ancora leggendo questa domanda e risposta e si riferiscono ad essa nelle loro domande e pensano che nulla è cambiato, vorrei aggiungere alcuni commenti per chiarezza e fornire una risposta “moderna” o più recente.

I dati di base sono una bestia potente, ma devi imparare a controllare la bestia, e grazie ai pionieri che hanno risposto in precedenza e ai miglioramenti apportati da Apple al framework, è molto più facile da fare oggi di quanto lo fosse un paio di anni fa (in particolare iOS 5).

Inizialmente raccomanderei di imparare come preparare un modello di dati solido e robusto. C’è un’enorme quantità di informazioni su questo, quindi lo lascio al lettore per indagare. Come menzionato nelle risposte precedenti, è importante imparare a preparare tutte le relazioni nel modello di dati.

Oltre a ciò, ci sono un certo numero di meccanismi per controllare la dimensione del set di dati che si recupera. Non mi è stato spiegato meglio che in un libro di The Pragmatic Bookshelf – “Core Data, 2a edizione, archiviazione e gestione dati per iOS, OS X e iCloud” (gennaio 2013) di Marcus S. Zarra, e in particolare Capitolo 4 intitolato “Performance Tuning”.

Leggilo.