Sto provando a determinare quando un'applicazione web deve interrogare un database per i dati correlati che possono o non possono essere utilizzati nella richiesta corrente.
Ad esempio, considera un database che tiene traccia delle risorse per un'azienda. C'è una tabella delle risorse, una tabella dei proprietari e una tabella degli utenti. Le risorse possono essere assegnate a un OwnerID e i record di asset tracceranno gli UserID che hanno creato, aggiornato e cancellato l'asset.
Quando faccio richieste web per i dati, vedo due opzioni principali:
-
Leggi tutti i dati in una richiesta, con un join in Proprietari e più join in Utenti (utente creato / aggiornato / cancellato). Mentre questo rende più difficile una query, ridurrebbe le chiamate ripetute al database. Semplifica inoltre l'uso di OOP all'interno dell'applicazione, poiché ogni entità sarà completamente popolata e facilmente accessibile, ad esempio: Asset.Owner.Email, Asset.LastUpdatedBy.Name, ecc.
-
legge solo i dati dalla tabella dei proprietari in primo piano e crea richieste di database separate quando l'applicazione richiede informazioni di proprietario o utente diverse dall'ID. In circa la metà delle richieste HTTP, non saranno richieste informazioni aggiuntive, e nell'altra metà delle richieste HTTP, l'applicazione dovrà interrogare il nome, l'email, ecc. Del proprietario e di ciascuno degli utenti che hanno creato, aggiornato o eliminato la risorsa. Mi piace l'idea della richiesta iniziale snella, ma mi preoccupo delle prestazioni quando faccio altre richieste per ottenere i dati correlati. Inoltre, complica il design OOP nell'applicazione; Invece di essere in grado di recuperare semplicemente Asset.Owner.Email, dovrò prima controllare se l'oggetto Asset.Owner è stato popolato, chiamare Asset.LoadOwnerByID (Asset.OwnerID), quindi accedere finalmente al valore. (Ignora il fatto che Asset non dovrebbe avere un metodo LoadOwnerByID - questo è solo un esempio.)
Ora che l'ho scritto, mi sto orientando verso l'Opzione 1 come il modo più efficiente e semplice di fare le cose. Ma diventa un po 'meno ovvio quando si aggiungono più relazioni ricorsive ai dati, ad esempio: ogni utente ha un valore ReportsToUserID che punta a un altro utente e ogni proprietario ha un campo AccountManagedByUserID che punta a un utente.
In questi esempi, qual è il tuo modo preferito di fare le cose e che cosa hai trovato per essere il più efficiente, sia in termini di prestazioni che di complessità della programmazione?
PS - Sto intenzionalmente tralasciando le specifiche sul framework web e sul tipo di database perché ho avuto questa domanda in tutti gli ambienti, da ASP.Net / MSSQL a Java / SQLite a PHP / MySQL, e credo che i principi si applicherà generalmente a tutti questi ambienti.