Angående din första fråga:
Du ber specifikt om ett bättre sätt att arbeta med barn-ID som lagras i föräldern. Jag är ganska säker på att det inte finns något bättre sätt att hantera detta, om det måste vara det här mönstret.
Men detta problem finns också i relationsdatabaser. Om du vill spara ditt inlägg i en relationsdatabas (med det mönstret) måste du också först skapa kommentaren, hämta dess ID och sedan uppdatera inlägget. Visst, du kan skicka alla dessa uppgifter i en enda förfrågan, vilket förmodligen är mer effektivt än att använda mongoose, men den typ av arbete som måste utföras är densamma.
Angående din andra fråga:
Fördelen jämfört med variant A är att du till exempel kan få inlägget och omedelbart veta hur många kommentarer det har, utan att be mongodb gå igenom säkert hundratals dokument.
Fördelen jämfört med variant B är att du kan lagra fler referenser till kommentarer i ett enda dokument (ett enda inlägg), än hela kommentarer, på grund av mongos 16 MB dokumentstorleksgräns.
Nackdelen är dock den du nämnde, att det är ineffektivt att upprätthålla den strukturen. Jag antar att detta bara är ett exempel för att visa upp scenariot, så här är vad jag skulle göra:Jag skulle bestämma från fall till fall vad jag skulle använda.
-
Om dokumentet kommer att läsas mycket och inte mycket skrivs till, OCH det är osannolikt att det blir större än 16 MB:Bädda in underdokumentet. på så sätt kan du få all data i en enda fråga.
-
Om du behöver referera till dokumentet från flera andra dokument OCH din data måste verkligen vara konsekvent, då har du inget annat val än att referera till det.
-
Om du behöver referera till dokumentet från flera andra dokument MEN datakonsistens är inte så superviktigt OCH begränsningarna från den första punkten gäller, bädda sedan in underdokumenten och skriv kod för att hålla dina data konsekventa.
-
Om du behöver referera till dokumentet från flera andra dokument, och de skrivs till mycket, men läses inte så ofta, det är förmodligen bättre att hänvisa till dem, eftersom detta är lättare att koda, eftersom du inte behöver skriva kod för att synkronisera dubblettdata.
I det här specifika fallet (inlägg/kommentar) hänvisar man till föräldern från barnet (låt barnet veta föräldrarna _id
) är förmodligen en bra idé, eftersom det är lättare att underhålla än tvärtom, och dokumentet kan växa sig större än 16 MB om de bäddades in direkt. Om jag med säkerhet visste att dokumentet INTE skulle vara större än över 16 MB, skulle det vara bättre att bädda in dem, eftersom det går snabbare att söka efter data på det sättet