Sto lavorando a un'app Meteor che consente agli utenti di creare eventi e assegnare loro membri dell'equipaggio. Ho suonato in giro con MongoDB prima e ho fatto alcune esperienze lungo la strada, dove ad esempio il mio primo tentativo è andato fuori bordo con oggetti incorporati e rapidamente diventato lento e difficile da mantenere. Diverse persone hanno quindi suggerito di provare un approccio di design più tradizionale ed è quello che ho fatto questa volta.
Ho suddiviso le mie raccolte con i riferimenti manuali in mente,
Eventi
_id : ObjectID,
propA: "Some prop",
propB: "Some other prop",
employees: [
{employee_id: ObjectID, crew_id: ObjectID},
{employee_id: ObjectID, crew_id: ObjectID},
]
I dipendenti
_id : ObjectID,
propA: "Some prop",
crew_id: ObjectID
Crews
_id : ObjectID,
propA: "Some prop"
Il ragionamento è che la raccolta di eventi diventerà piuttosto sostanziale durante il ciclo di vita delle applicazioni e quindi ritengo che la duplicazione sia una cosa negativa. Un'altra caratteristica degna di nota è che un dipendente deve appartenere a un certo equipaggio, ma su un evento reale può lavorare in qualsiasi equipaggio.
Inizialmente ero abbastanza contento di questo progetto, ma ho comunque riscontrato alcuni problemi che mi hanno portato qui.
1) Quando elenco un evento devo unire manualmente i ref per mostrare le proprietà effettive dei dipendenti e degli equipaggi (come il nome), è un po 'noioso, ma ciò che mi preoccupa di più sono le prestazioni: piuttosto che eseguire una query Devo eseguire tre (prima ottenere l'evento, quindi passare attraverso l'array di dipendenti e poi unire il dipendente con la collezione Employee e infine unirmi all'equipaggio con la collezione Crew).
2) Il mio problema più grande finora è quello che credo sia noto come deep querying. Prima di aggiungere un dipendente a un evento, devo sapere se è già stato assegnato, quindi è necessario interrogare la raccolta Eventi per un evento con un determinato ID e trovare anche la verifica se l'ID dipendente impiegato esiste nell'array dei dipendenti. Finora non sono stato in grado di farlo in una singola query.
Quindi la mia domanda si riduce a questo. Il mio design è bello così com'è o dovrei cambiarlo dato i miei casi d'uso? O in alternativa, se mantengo il mio attuale design, come dovrei affrontare il problema 1 e 2 (vale a dire, i join manuali e i ref vanno bene, ma le prestazioni sono un vero e proprio stop-stop possibile?).