Du kan antingen designa ett schema där du kan referera eller bädda in dokument. Låt oss titta på det första alternativet för inbäddade dokument. Med din ansökan ovan kan du lagra informationen i ett dokument enligt följande:
// db.table1 schema
{
"_id": 3, // table1_id
"is_active": true,
"created": ISODate("2015-04-07T16:00:30.798Z"),
"lang": [
{
"name": "foo",
"surname": "bar",
"address": "xxx"
},
{
"name": "abc",
"surname": "def",
"address": "xyz"
}
]
}
I exemplet ovan skulle du ha bäddat in table1_lang
information i table1
dokumentera. Denna design har sina fördelar, en av dem är datalokalitet. Eftersom MongoDB lagrar data kontinuerligt på disken, säkerställer att lägga all data du behöver i ett dokument att de snurrande diskarna tar kortare tid att söka till en viss plats på disken. Om din applikation ofta använder table1
information tillsammans med table1_lang
data så kommer du nästan säkert att vilja gå den inbäddade vägen. Den andra fördelen med inbäddade dokument är atomiciteten och isoleringen i att skriva data. För att illustrera detta, säg att du vill ta bort ett dokument som har en lång nyckel "name" med värdet "foo", detta kan göras med en enda (atomär) operation:
db.table.remove({"lang.name": "foo"});
För mer information om datamodellering i MongoDB, läs dokumenten Introduktion till datamodellering , särskilt Modell En-till-många-relationer med inbäddade dokument
Det andra designalternativet är att referera till dokument där du följer ett normaliserat schema. Till exempel:
// db.table1 schema
{
"_id": 3
"is_active": true
"created": ISODate("2015-04-07T16:00:30.798Z")
}
// db.table1_lang schema
/*
1
*/
{
"_id": 1,
"table1_id": 3,
"name": "foo",
"surname": "bar",
"address": "xxx"
}
/*
2
*/
{
"_id": 2,
"table1_id": 3,
"name": "abc",
"surname": "def",
"address": "xyz"
}
Ovanstående tillvägagångssätt ger ökad flexibilitet när det gäller att utföra frågor. Till exempel för att hämta alla underordnade table1_lang
dokument för huvudenheten table1
med id 3 kommer att vara okomplicerat, skapa helt enkelt en fråga mot samlingen table1_lang
:
db.table1_lang.find({"table1_id": 3});
Ovanstående normaliserade schema med dokumentreferensmetoden har också en fördel när du har en-till-många-relationer med mycket oförutsägbar aritet. Om du har hundratals eller tusentals table_lang
dokument per give table
Entity, inbäddning har så många bakslag vad gäller rumsliga begränsningar eftersom ju större dokumentet är, desto mer RAM-minne använder det och MongoDB-dokument har en hård storleksgräns på 16 MB.
Den allmänna tumregeln är att om din applikations frågemönster är välkänt och data tenderar att bara nås på ett sätt, fungerar en inbäddad metod bra. Om din applikation frågar efter data på många sätt eller om du inte kan förutse datafrågemönstren, kommer en mer normaliserad dokumentreferensmodell att vara lämplig för sådana fall.
Ref:
MongoDB Applied Design Patterns:Practical Use Cases with the Leading NoSQL Database av Rick Copeland