Come dovrei creare un oggetto dopo che il database inserisce PHP

0

Ho appena lavorato a un nuovo progetto e sto facendo le cose nello stesso modo in cui ho lavorato per anni. Tuttavia, per la prima volta, penso costantemente a scalability and performance sia di application code sia di database .

Quindi, in passato, sono stato più che felice di insert una nuova riga, quindi prendi last_insert_id e poi traduco questo in object chiamando il metodo getObjectById(id) dall'interno del framework di persistenza in uso. Trovo che ciò sia una buona pratica perché farà in modo che tu stia restituendo esattamente ciò che è archiviato nel database e qualsiasi errore verrà rilevato lì e quindi, piuttosto che la prossima volta che chiedi l'oggetto.

L'altro modo, dato che hai tutti i dati necessari per costruire l'oggetto di fronte a te, è semplicemente creare il nuovo oggetto dai dati forniti e semplicemente impostare objectId una volta che l'istruzione è stata verificata come completa. Mi sono sempre sentito come se ci fossero ancora alcune incognite che possono accadere e se ci sono triggers nel database che trasforma i dati in qualche modo, allora si avrà uno stato di non corrispondenza che è negativo.

Tuttavia, pensando esclusivamente alle prestazioni, sto ovviamente prendendo un colpo eseguendo più queries per creare l'oggetto ( insert più select ) che aggiunge overhead e vorrei rendere l'applicazione sia come fast e secure il più possibile.

La mia domanda è: quale sarebbe l'approccio più appropriato per performance , scalability , security e poi per il trade-off tra il 3?

    
posta samazi 08.05.2014 - 05:57
fonte

2 risposte

2

Si verifica un problema di prestazioni quando il sistema non soddisfa i suoi requisiti funzionali.

Pertanto, a meno che i tuoi utenti non si lamentino o non rispetti un Contratto sul livello di servizio, non hai un problema di prestazioni.

Nel tuo caso è molto improbabile che l'extra "insert" / "select" implichi un overhead che potrebbe essere percepibile da un utente finale, o misurabile in termini di prestazioni complessive del sistema.

Dopo tutto probabilmente inserirai i dati ad un certo punto e invocando una selezione su un oggetto che hai inserito meno di un millisecondo fa non comporterai alcun I / O del database. Di fatto non avrai ritardi dovuti all'attività di I / O fino a quando non "COMMITTI" il tuo lavoro. L'inserimento precedente darà al database la possibilità di registrare le modifiche prima di eseguire il commit in modo che il processo possa essere effettivamente più veloce dell'alternativa.

"Se non è rotto non aggiustarlo"

    
risposta data 08.05.2014 - 07:09
fonte
1

Innanzitutto, la risposta di @ JamesAnderson sta rilevando punti davvero validi. Penso anche che tu sia inutilmente paranoico riguardo alle prestazioni a questo punto.

Parlando della tua domanda, di solito la faccio in modo diverso. Invece di inserire i dati nel database e quindi caricarli di nuovo e creare un'istanza di una classe base su quei dati, di solito creo prima l'istanza della classe, quindi utilizzo un metodo come $obj->save() per inserire i dati nel database; ma farlo in realtà dipende da come Robusto hai progettato il Database e Classi .

Ad esempio:

  • Hai implementato un incapsulamento corretto? Specialmente un solido setter per i campi che dovrebbero essere memorizzati nel database? Oppure esponi importanti proprietà di classe tramite public accessor in cui potrebbero essere modificate senza controllo?
  • Le tabelle del database accettano valori NULL quando non è necessario, invece di fallire l'operazione? O hai impostato alcuni valori predefiniti per alcuni campi che potrebbero non essere davvero saggi e probabilmente problematici in futuro?

L'elenco precedente potrebbe richiedere molto più tempo, ma il punto è che se ti fidi dei dati che hai all'interno dei tuoi oggetti, e anche se ti fidi del tuo database che inserirà i dati corretti o fallirà in qualsiasi altri casi - quindi non verrà restituito InsertID che è un segno di fallimento; Se si soddisfano questi punti nella progettazione e nell'implementazione, non sarà necessario inserire i dati e quindi caricarli nuovamente per accertarsi dell'integrità dei dati.

    
risposta data 08.05.2014 - 09:58
fonte

Leggi altre domande sui tag