2009-09-19 3 views
5

Ho 4 sottoclassi: Video, Image, Note e Form. Ognuno contiene diversi tipi di dati. Ad esempio, la classe Image contiene un percorso per il file immagine su disco e le proprietà dell'immagine e la classe Form contiene i valori del campo modulo. L'elemento comune tra ogni elemento, tuttavia, è le coordinate GPS e direzione, in modo da avere la seguente classe di base astratta:modello una classe base astratta e sottoclassi in un database

public abstract class Content 
{ 
    public float? Latitude { get; set; } 
    public float? Longitude { get; set; } 
    public float? Heading { get; set; } 
} 

Tuttavia, quando ho velato è su come modellare questo in un database. Attualmente ho un tavolo chiamato Events (per esempio, diciamo che un evento è una festa di compleanno) e 4 tavoli (Videos, Images, Notes e Forms). Ogni tabella ha una chiave esterna che rimanda alla chiave primaria Events.

Utilizzando LINQ-to-SQL, ottengo 5 classi per ogni tabella. Questo va bene se voglio solo un tipo di dati, ad esempio Event.Images, ma quello che voglio fare è contare il numero totale di "contenuti" di un Event e ottenere le coordinate GPS. Posso regolare facilmente il conteggio semplicemente usando Event.Images.Count() + Event.Videos.Count() + ..., ma non posso fare lo stesso per le coordinate GPS. C'è un modo in cui posso modellare il database in modo che io possa usare una classe base per ogni articolo ed essere ancora in grado di ottenere l'elemento fortemente tipizzato quando devo vedere i suoi dati?

risposta

8

Ci sono tre diversi modelli di questo documentati nei modelli di Enterprise Application Architecture, ciascuno con differenti trade-off di Martin Fowler:

+0

Grazie per il link. Non danno esattamente una buona descrizione su come usare i modelli, ma mi dà un punto di partenza per fare più ricerca. Personalmente, ho sempre pensato che il modello a tabella singola fosse una cattiva idea, perché significa che se aggiungi una nuova sottoclasse, dovrai aggiungere nuove colonne per i suoi dati, e questo può mongolfiera a una dimensione indesiderabile, anche se per applicazioni più piccole posso vedere il merito di usarlo. –

+0

Ya, ci sono dei compromessi definitivi. Dipende solo dalla probabilità di aggiungere nuovi tipi. Se improbabile, potrebbe essere meglio evitare di attraversare più tabelle e utilizzare la tabella singola. Se probabile, uno degli altri modelli. E, sì, quei link sono piuttosto scarsi perché vogliono che tu compri il libro :-) È un buon libro - vale la pena di pensarlo. – SingleShot

1

Quello è un modo per farlo.

In generale, ci sono altri due modi:

  • tabella per ogni sotto-classe: invece di cercare di condividere i baseclass nel database, basta creare tabelle separate per ciascuno di essi.

  • tabella per gerarchia: inserire un superset di tutti i campi in una tabella, nonché una colonna "discriminatore" e memorizzarli in un unico punto.

di capire che è giusto, pensare alle modalità di utilizzo:

  • se generalmente li trattano in modo indipendente, e di query in modo indipendente, tavoli separati sono un buon modo per go-- sia quello che si avere o tabella per sottoclasse.
  • se questi sono trattati come le collezioni eterogenee, così si vuole guardare a loro come ad esempio, una singola tabella può essere più facile

vedere anche ciò che il vostro strumento supporta più naturalmente. Funzionano tutti.

+0

Grazie per la risposta. Si scopre che ho bisogno di cambiare l'intero modello di dominio in ogni caso, quindi il mio problema si è risolto, per così dire. –

-2

In realtà, questa domanda esatta viene richiesta molto, ed è stata answered many times. Probabilmente non hai cercato la terminologia del database.

Il problema sta applicando la terminologia OO e il pensiero in un'area non oggetto dell'oggetto; rendere un compito ordinario semplice molto complesso e limitato.

i libri di Martin Fowler e Scott Ambler di non valgono un dollaro per il sacco di loro, i dettagli in this answer, a partire dal 11 dicembre ingresso.

+6

-1, ho posto questa domanda il 2009-09-19, prima che venissero creati gli articoli che hai collegato. La tua risposta non è affatto una risposta, ma insulti sottilmente velati contro di me e due persone ben rispettate nel settore. –

+2

@Daniel. Questo thread continua a venire, su altri thread (correnti), che è il modo in cui l'ho trovato. Scusa, non ho notato che era del 2009. Nessun insulto destinato a te. Fowler & Ambler hanno molto da rispondere. Sono felice di rispondere a specifiche, ma non è possibile rispondere alle generalità di Fowler/Ambler o ai tuoi sentimenti (ad esempio, qual è l '"insulto"?) – PerformanceDBA