2011-12-16 11 views
8

Nella mia app, ho un ID univoco per ogni oggetto (tabelle).Associazione polimorfica delle rota senza tipo (ID univoco)

Ora, per questo motivo, quando si utilizza l'id, so che tipo di oggetto è, sia che si tratti di un utente o di un hotel.

Mi chiedevo se potevo salvare la ricerca per il item_type in associazioni polimorfiche, correggere la ricerca con una sequenza di identificazione id in memoria, salvando così lo spazio nel DB e nell'indice.

Questo può essere fatto?

sto lavorando con Rails 3.0.9, Ruby 1.9.2

risposta

1

Questo non può essere la risposta che stai cercando. Sono sicuro che questo sia possibile in qualche modo, ma tu combatteresti contro il modo in cui il polimorfismo è stato progettato in ActiveRecord, e questo probabilmente causerebbe un carico di dolore.

La prima domanda che viene da me è perché? Stai chiedendo un'ottimizzazione delle prestazioni. Stai vedendo un problema di prestazioni? Hai verificato con strumentazione, New Relic, il profiler Ruby e altri strumenti che questa seconda ricerca è davvero ciò che sta uccidendo la tua performance? Se non hai fatto nulla di tutto ciò, probabilmente stai perdendo tempo. Prevedere i colli di bottiglia delle prestazioni è una scienza imprecisa e soggetta alla regola 80-20.

Se si ha davvero questo problema e si è stati approfonditi nell'analizzare i registri, i nuovi grafici di Relic, si è isolato il problema ed eseguito test delle prestazioni contro di esso, se si è fatto tutto ciò, e stai vedendo un problema di prestazioni proprio con questo problema, quindi suggerirei che probabilmente una soluzione di denormalizzazione ti darà qualche miglioramento. La denormalizzazione è uno strumento comune per ottimizzare i problemi di prestazioni del database. Conserveresti i dati in più di una posizione, ma le tue query dovranno toccare meno tabelle (più veloce), con il sovraccarico extra di mantenere sincronizzati più bit durante l'aggiornamento dei record (codice dell'applicazione più complesso).

Se potessi pubblicare un po 'più di dettaglio sul tuo esempio, sarebbe più facile fare qualche suggerimento più concreto o dare esempi.

+1

Abbiamo avuto una conversazione ottimizzazione DB con Percona. Una delle prime cose che hanno detto è che questa associazione polimorfica sta uccidendo il nostro DB. Dato che stiamo lavorando con tabelle di milioni di righe, questa è un'operazione molto costosa sia per interrogare che per indicizzare. Poiché questo è un varchar, è ancora più costoso di un numero intero. Quando lo scavavo e vedevo quanto fosse difficile, sono tornato a Percona per dire cosa succederebbe se non lo facessimo e hanno detto che è assolutamente da rimuovere. Ecco perché ... – KensoDev

+1

Penso che sarebbe ancora buono se tu vedessi alcuni dati di prestazione reali. Ma forse, la denormalizzazione potrebbe essere la soluzione. Perché non pubblichi alcuni esempi e possiamo discuterne ulteriormente? –

+1

A proposito, se ti è piaciuta la risposta, ti preghiamo di accettarla (grande segno di spunta accanto ad essa). –