sql >> Databasteknik >  >> NoSQL >> MongoDB

Denormalisering av data i MongoDB

Inte alltid, normalisering till döden orsakar prestationsträffar, men det är sant att jag personligen inte tillämpar samma normalisering på MongoDB som jag gör SQL.

Om du är medveten om de normaliserade formerna ( http://en.wikipedia.org/wiki/Database_normalization ) Jag gillar att tro att MongoDB går till 1NF och sedan tillbaka till denormaliserad igen.

Åh ja det gör vi. Det är jobbigt att uppdatera om data dupliceras fel.

Låt mig ge dig ett exempel:category och product skulle vara två separata enheter, det går inte att förneka det. Dessa två enheter är normaliserade (repeterande data för product har spridits från category ). Ett annat sätt att tänka på det är:Kommer alla produkter bara att finnas i en kategori?

Så på toppnivåenheter, som du kan se, gäller samma regler relativt sett med 1NF som lätt kan tillämpas på MongoDB.

På framsidan av duplicering skulle du naturligtvis inte vilja lagra varje produkt separat inom varje kategori (jag svarade nej på frågan ovan) så du skulle naturligtvis vilja separera kategorier och produkter.

Du skulle normalt ha en många-till-många-relation här med en normaliserad tabell i mitten. Det är här de-normalisering kan komma in. Du kan säga att en kategori kommer att ha en lista över produkter som är unika för den kategorin, så du kan avnormalisera den många-till-många relationstabellen till kategoriraden som en lista (eller tvärtom in i produktraden). Detta kommer inte att generera dubblering eftersom den listan är unik för den kategorin (mer än troligt). Detta betyder naturligtvis att kategorin eller produkterna skulle innehålla en lista _id s för den relaterade raden istället för själva objektet.

Det finns tillfällen då duplicering är nödvändig, främst för optimering eller för att undvika JOINs; denna regel gäller även för SQL om du någonsin har gjort en tillräckligt stor webbplats.

Typiska användningsscenarier för duplicering är aggregerade fält av statistik som att Facebook gör delningar och kommentarer och kanske till och med de 5 senaste kommentarerna i det inlägget skulle också dupliceras på inläggsraden.

Så det handlar inte om att ignorera schemadesign utan mer att ställa in det för MongoDBs egenskaper. Normalt om du gör det kommer du att upptäcka att du, naturligtvis, designar ett bra schema.

Som en extra referens kan du hänvisa här:http://docs.mongodb.org/ manual/core/data-modeling




  1. stöder mongoose virtuella fält i utvalda som SQL

  2. Få returvärdet för reactivemongo findAndUpdate-funktionen

  3. Skriver tester för Python Eve RESTful API:er mot en riktig MongoDB

  4. gruppera efter datum i mongodb