2009-05-30 20 views
13

Attualmente sto leggendo sulla possibilità di utilizzare l'ereditarietà con Entity Framework. A volte utilizzo un approc per digitare record di dati e non sono sicuro di utilizzare TPT o TPH o nessuno ...Ereditarietà di Entity Framework: TPT, TPH o nessuno?

Ad esempio ... Ho un negozio di e-commerce che aggiunge indirizzo di spedizione, fatturazione e consegna

ho una tabella indirizzo:

RecordID 
AddressTypeID 
Street 
ZipCode 
City 
Country 

e un tavolo AddressType

RecordID 
AddressTypeDescription 

la struttura della tabella differisce al g disegno erneral quando la gente in mostra TPT o TPH ... Ha senso pensare a un'eredità quando avere un approccio come questo ..

Spero ha senso ...

Grazie per qualsiasi aiuto ...

risposta

9

Quando si considera come rappresentare l'ereditarietà nel database, è necessario considerare alcune cose.

Se si dispone di molte sottoclassi diverse, è possibile avere molti join aggiuntivi nelle query che riguardano quei tipi più complessi che possono compromettere le prestazioni. Un grande vantaggio di TPH è che si esegue una query su una tabella per tutti i tipi nella gerarchia e questo è un vantaggio per le prestazioni, in particolare per le gerarchie più grandi. Per questo motivo tendo a favorire tale approccio nella maggior parte degli scenari

Tuttavia, TPH significa che non è più possibile avere campi NOT NULL per sottotipi poiché tutti i campi di tutti i tipi si trovano in un'unica tabella, spingendo la responsabilità dell'integrità dei dati verso la tua applicazione. Anche se questo può sembrare orribile nella pratica, non ho trovato che questa sia una restrizione troppo grande.

Tuttavia, tenderei a utilizzare TPT se ci fossero molti campi per ogni tipo e che il numero di tipi nella gerarchia fosse probabilmente basso, il che significa che le prestazioni non erano tanto un problema con i join, e ottieni una migliore integrità dei dati.

Si noti che uno dei vantaggi di EF e di altri ORM è che è possibile cambiare idea lungo la traccia senza influire sull'applicazione in modo che la decisione non debba essere completamente scolpita nella pietra.

Nel tuo esempio, non sembrano avere una relazione di ereditarietà, sembra un uno a molti dal tipo di indirizzo agli indirizzi

Questo sarebbe rappresentato tra le classi qualcosa di simile al seguente:

Address.AddressType 
AddressType.Addresses 
4

Come Keith suggerisce, questo suggerisce article TPT in EF scale terribilmente, ma non ho provato me stessa.

-3

Cerca this article. Alcuni aspetti dell'utilizzo dell'ereditarietà sono considerati.

+0

il link non è più valido. Per favore correggi o cancella questa risposta –