2012-05-31 17 views
7

Ho un vecchio rompicapo, quindi ho pensato di condividerlo con te, forse avrò la giusta direzione. Il fatto è che alcune delle nostre entità nel database sono piuttosto grandi (leggi hanno molte proprietà) e raramente la logica aziendale utilizza tutte le proprietà dell'entità, quindi ogni volta ho bisogno di pensare quali proprietà devono essere caricate affinché la logica di business funzioni correttamente. Molto ipotetico campione:Le entità fanno troppo?

public class Product 
{ 
    public string Title {get;set;} 
    public string Description {get;set;} 

    public string RetailPrice {get;set;} 
    public string SupplierId {get;set;} 

    public Supplier Supplier { get;set;} 

    // many other properties 
} 

public class ProductDiscountService 
{ 
    public decimal Get(Product product) 
    { 
     // use only RetailPrice and Supplier code 
     return discount; 
    } 
} 

public class ProductDescriptionService 
{ 
    public string GetSearchResultHtml(Product product) 
    { 
     // use only Title and Description 
     return html; 
    } 
} 

Sembra che ho potuto estrarre interfacce IDiscountProduct e ISearchResultProduct, prodotto marchio come attuazione di queste interfacce, quindi creare DTOs più piccole di attuazione ciascuna di queste interfacce, ma che guarda al momento come eccessivo (almeno Non ho visto nessuno raggruppare le proprietà usando le interfacce).

Per dividere l'entità nel database in entità più piccole anche non sembra ragionevole, poiché tutte queste proprietà appartengono al prodotto e temo che sarò costretto a utilizzare molti join per selezionare qualcosa e se deciderò che alcune proprietà appartengono a un'altra entità, questa mossa sarà piuttosto difficile da implementare.

Per avere ogni proprietà utilizzata nella logica di business di un particolare metodo come parametro di metodo sembra anche una soluzione non valida.

+0

Di quante proprietà stiamo parlando? – walther

+0

in genere più di 10, meno di 20. – Giedrius

+0

Direi: se il metodo conosce in anticipo quali proprietà utilizzare e questo rimane fisso, l'utilizzo dei parametri potrebbe essere una buona soluzione. Facile da testare e facile da riutilizzare. Tuttavia, se l'implementazione non è definita nella firma del metodo (l'implementazione corrente utilizza 2 proprietà ma domani potrebbero diventare 3), si desidera utilizzare l'intera caratteristica del prodotto con tutte le proprietà disponibili. Questo parla in modo coerente: questo metodo richiede questi parametri e questo metodo richiede un prodotto. – Polity

risposta

1

A meno che le proprietà non siano grandi (leggi stringhe lunghe e/o binari), le caricherò tutte.

I punti di seguito sono oggetti semplici (ad esempio il titolo)

  1. No codice aggiuntivo (ottenere questo prodotto con il titolo solo, o ottenere con il prezzo unico, bla-bla)
  2. Un'istanza prodotto è sempre completo, così puoi passarlo senza verificare se la proprietà è nullo.
  3. Se è necessario caricare pigro alcune altre proprietà, ti costerà di più che caricarle con impazienza. Se hai 20 proprietà - questo non è nemmeno un oggetto grande (di nuovo, se la tua (descrizione) Descrizione non è di dimensioni in kilobyte).

Ora, se si hanno oggetti correlati (ProductSupplier) - questo dovrebbe essere pigro-caricato, imo, a meno che non si sappia che questa proprietà verrà utilizzata.

+0

Bene, nella descrizione del progetto reale è html, quindi diversi kilobyte sono un caso normale.Un'altra cosa è che, a causa della natura del nostro modello di business, di solito elaboriamo grandi quantità di prodotti (migliaia), quindi il caricamento lento non è accettabile a causa del numero elevato di query. Quindi, se hai migliaia di prodotti e kilobyte in proprietà, diventa molto importante ciò che carichi dal database :) Stavo pensando di mettere un po 'di memoria di lettura veloce come il rossis in mezzo, a patto che ci siano molte più letture che scritture. – Giedrius

+0

Dipende da un tipo di elaborazione. Quando abbiamo dovuto lavorare con un ampio set di dati nel passato - l'abbiamo appena caricato in memoria, e abbiamo lavorato da lì, ma quel set era di sola lettura .. e abbiamo finito per abbandonare quella soluzione e tornare al database. Ad ogni modo, nel tuo caso, penso che misurerei quanto spesso hai effettivamente bisogno delle proprietà, e qual è l'impatto reale del loro caricamento impaziente. Continuo a non pensare che molti Kb per record siano così tanti - anche se hai qualche (5-10?) Migliaia di record, bastano pochi MB da leggere. Avere degli indici appropriati sarebbe molto più importante. – Evgeni

+0

Anche Reddis o memcached potrebbero valere la pena dare un'occhiata. Dipende dai tuoi bisogni, ma qualcosa come RavenDB potrebbe essere d'aiuto. – Evgeni

Problemi correlati