MongoDB schemos projektavimas sutelktas į pagrindinį sprendimą: įterpimas (susijusių duomenų saugojimas dokumento viduje) ir nuorodos (susijusių duomenų saugojimas atskiruose dokumentuose/kolekciose su nuorodomis). Skirtingai nei SQL numatytasis normalizavimas, MongoDB projektavimas optimizuojamas duomenų prieigos būdui.
Įterpimas — susijusius duomenis saugokite kartu
// embed related data within the document
{
_id: ObjectId("..."),
name: "Ann",
address: { city: "NY", zip: "10001" }, // embedded sub-document
orders: [ // embedded array of orders
{ product: "Phone", amount: 999 },
{ product: "Case", amount: 20 }
]
}
// → ONE query gets the user AND their address AND orders (no joins)
Įterpimas laiko susijusius duomenis viename dokumente — perskaitykite viską viena užklausa (greitai, be jungčių). Gerai tinka duomenims, kurie pasiekiami kartu, ir santykiams "sudėtyje".
Nuorodos — atskirus dokumentus susiverkite
// store a reference (id) to a document in another collection
{ _id: ObjectId("u1"), name: "Ann" } // users collection
{ _id: ObjectId("o1"), userId: ObjectId("u1"), product: "Phone" } // orders collection
// → query orders by userId; use $lookup to join when needed
Nuorodos saugo duomenis atskirai ir susieja pagal id (panašiai kaip užsienio raktas) — užklauskite atskirai arba sujunkite naudodami $lookup.
Kada įterpti, o kada nurodyti nuorodą
EMBED when:
✓ data is accessed TOGETHER (read the parent → you want the children)
✓ a "contains"/ownership relationship (address, order line items)
✓ the embedded data is bounded (not unboundedly growing)
✓ one-to-few relationships
REFERENCE when:
✓ data is large or grows UNBOUNDEDLY (avoid huge documents — 16MB doc limit!)
✓ data is accessed/updated INDEPENDENTLY
✓ many-to-many or one-to-many with many
✓ the same data is shared/referenced by many documents (avoid duplication)
Projektavimas pagal prieigos modelius (pagrindinį principą)
MongoDB schema design is driven by HOW YOU QUERY the data, not pure normalization:
→ Structure data so common queries are efficient (often a single document read).
→ "Data that is accessed together should be stored together."
→ This may mean DENORMALIZING (some duplication) for read efficiency — acceptable
in MongoDB, traded against update complexity.
Kodėl tai svarbu
Schemos projektavimas yra kritiškai svarbus MongoDB — jis skiriasi nuo SQL ir, žinoma, yra reikšmingesnis nei SQL, nes MongoDB lankstus dokumentų modelis suteikia pasirinkimus, kurie labai paveikia našumą ir prižiūrimumą, todėl jo supratimas yra būtinas veiksmingų MongoDB aplikacijų kūrimui.
Centrinis sprendimas — įterpimas ar nuorodos — yra apibrėžiantis MongoDB projektavimo pasirinkimas: įterpimas (susijusių duomenų saugojimas dokumento viduje) suteikia greitą vienos užklausos skaitymo galimybę susijusiems duomenims (be jungčių) ir tinka duomenims, kurie pasiekiami kartu, ir santykiams "sudėtyje", o nuorodos (atskirų dokumentų sujungimas pagal id) tinka didiems/neapribojiems duomenims, nepriklausomai pasiekiamiems duomenims ir bendriems/daugeliniams santykiams.
Supratimas kada naudoti kiekvieną (įterpimas ribojitiems, kartu pasiekamiems, nuosavybės duomenims; nuorodos — didiems/augamiems, nepriklausomiems, bendrintiems arba daugiaciiams santykiams — ir atsargumas MongoDB 16MB dokumentų dydžio ribos atžvilgiu) yra pagrindinė įgūdžiai.
Svarbiausiai, supratimas vadovaujančio principo — projektavimas pagal prieigos modelius (duomenų išdėstymas pagal tai, kaip juos užklausite, todėl įprasti užklausai yra efektyvūs, dažnai vieno dokumento skaitymas, o ne numatytasis normalizavimas kaip SQL) — tai skiriasi gerą MongoDB schemos projektavimą.
Tai gali reikšti tam tikro denormalizavimo (dubliavimo) skaitymo efektyvumui priimti — savitarpavimo su atnaujinimo sudėtingumu, kuris MongoDB yra priimtinas ir dažnai teisingas.
Kadangi schemos projektavimas giliai paveikia MongoDB aplikacijos našumą ir prižiūrimumą (blogai pasirinkus įterpimą/nuorodą atsiranda lėtos užklausos, didžiuliai dokumentai arba atnaujinimo sudėtingumas), ir kadangi prieigos modeliams paremtas, įterpimo/nuorodos požiūris yra iš esmės kitoks nei SQL normalizavimas, supratimas MongoDB schemos projektavimo — įterpimo/nuorodos sprendimas, kada naudoti kiekvieną, ir projektavimas pagal prieigos modelius — yra būtinas, aukštos vertės žinojimas veiksmingų MongoDB aplikacijų kūrimui, vienas svarbiausių ir būdingiausių MongoDB temų, kurie atskiria tuos, kurie projektavę gerus dokumento schemos projektus, nuo tų, kurie naiviai perkelia reliacinius projektus.
