Supponiamo di avere 3 classi: ClassA
, ClassB
e ClassC
. Supponiamo ora di avere una classe Message
. Vuoi una relazione one-to-many
tra ciascuna di queste tre classi e il Messaggio.
L'obiettivo è che un Message
deve "appartenere" a un ClassA
, ClassB
o a ClassC
oggetto. Un oggetto ClassA
/ ClassB
/ ClassC
può avere zero o molti Messages
. La classe Message è la stessa per ognuna delle tre classi (cioè non dovrebbe esserci una diversa classe di Message per ognuna delle tre Classi A, B e C).
Considerando ora la modellazione dei dati su un DB relazionale (inoltre, sto usando ORM, in questo caso Entity Framework Code First ), mapperò ognuna di quelle 3 classi e il Message
class a una tabella.
Ma poi, il problema sta cercando di applicare le relazioni che ho spiegato sopra. Vedo alcuni modi per farlo:
- Aggiungi tre chiavi esterne nullable (
ClassAID
,ClassBID
,ClassCID
) alla tabella dei messaggi. per esempio. Se un messaggio appartiene a un oggettoClassA
, quindiClassAID
avrà l'ID di tale obetto come valore eClassBID
eClassCID
saranno nulli. Questo mi costringerà a scrivere un vincolo / trigger per assicurarmi che l'oggettoMessage
abbia solo un valore in uno di quegli FK. Inoltre rende un po 'brutto nei livelli Business Logic e Presentation ogni volta che voglio sapere a quale oggetto appartiene un messaggio: il MessageObject avrebbe un riferimento nullable a un oggetto ClassA, ClassB e ClassC e dovrei controllare prima di presentarlo nell'interfaccia utente (ad es. un link dal messaggio al suo oggetto).
- Implemental'ereditarietàegeneralizza
ClassA
,ClassB
eClassC
.IlmessaggiohaunFKperl'IDdellaclassegeneralizzata.CiòaggiungecomplessitàeinrealtànonrisolveilproblemadicapirefacilmenteaqualeClasseA/B/CècorrelatounMessaggio.
- Aggiungi una tabella
ClassToMessage
(simile a una tabella di collegamento) che collega le 3 tabelle a quella del messaggio, nuovamente, tramite FK nullable. Una specie di combinazione dei due precedenti, ma non ancora esattamente una buona soluzione per gli stessi motivi.
Mipiacerebbesaperesec'èunmodoeleganteperraggiungereloscenariodesiderato,preferibilmenteavendoinmentel'approcciodiEntiyFramework.Grazieinanticipo.
MODIFICA1:
ImmaginaglioggettiMessaggiocomecommenti(ofile)inunastrutturaadalberodioggetti(glioggettiClassA
possonoavereClassB
eClassB
possonoavereClassC
's...).Sidesideracheglioggettiditutteleclassiabbianozeroopiùcommenti.Vuoilastessatabelladicommentipertuttiicommenti(nonimportaseappartengonoaClassA
oClassB
...istanza).Vuoianchechesiafaciletrovareicommentiperundatooggettool'oggettoacuiappartieneuncommento.
EDIT2:
Altreduealternative:
- Implementalatabellapergerarchia(TPH)avendounClassAMessage,ClassBMessage...cheancoranonrisolveilproblema...
- Il messaggio memorizza l'ID dell'oggetto che lo possiede e il Tipo oggetto (indipendentemente dal fatto che sia stato un ClassA, ClassB ...). Nessuna relazione effettiva: livello di servizio o logica aziendale fa il resto (ahi).
HovistoquestoproblemaaffrontatoinStackOverflow,manonriescoatrovareunabuonasoluzione:
Primo codice di Entity Framework - Mappe di entità a uno o l'altro - Relazione oggetti multipli in codice prima
- Progettazione di database - articoli, post di blog, foto, storie
EDIT 3:
Sto perseguendo l'alternativa n. 4 (Tabella per gerarchia / ereditarietà delle tabelle di classe) e l'ho evoluta in un S.O. specifico. domanda: Entity Framework 6 Code First - Commenti su una struttura ad albero