Můžete buď navrhnout schéma, kde můžete odkazovat na dokumenty nebo je vkládat. Podívejme se na první možnost vložených dokumentů. S výše uvedenou aplikací můžete uložit informace v dokumentu následovně:
// 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"
}
]
}
Ve výše uvedeném příkladu schématu byste v podstatě vložili table1_lang
informace v hlavní table1
dokument. Tento návrh má své přednosti, jednou z nich je datová lokalita. Vzhledem k tomu, že MongoDB ukládá data souvisle na disku, umístění všech potřebných dat do jednoho dokumentu zajišťuje, že rotujícím diskům bude hledání konkrétního umístění na disku trvat kratší dobu. Pokud vaše aplikace často přistupuje k table1
informace spolu s table1_lang
data, pak budete téměř jistě chtít jít vestavěnou cestou. Další výhodou u vložených dokumentů je atomičnost a izolovanost při zápisu dat. Pro ilustraci řekněme, že chcete odstranit dokument, který má jazykový klíč „name“ s hodnotou „foo“, což lze provést jedinou (atomickou) operací:
db.table.remove({"lang.name": "foo"});
Další podrobnosti o modelování dat v MongoDB naleznete v dokumentech Úvod do datového modelování , konkrétně Model Vztahy typu One-to-Many s vloženými dokumenty
Další možností návrhu je odkazování na dokumenty, kde postupujete podle normalizovaného schématu. Například:
// 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"
}
Výše uvedený přístup poskytuje zvýšenou flexibilitu při provádění dotazů. Například k načtení všech podřízených table1_lang
dokumenty pro hlavní nadřazenou entitu table1
s id 3 bude jednoduché, jednoduše vytvořte dotaz na kolekci table1_lang
:
db.table1_lang.find({"table1_id": 3});
Výše uvedené normalizované schéma využívající přístup odkazu na dokument má také výhodu, když máte vztahy jedna k mnoha s velmi nepředvídatelnou aritou. Pokud máte stovky nebo tisíce table_lang
dokumenty na danou table
entita, vkládání má mnoho překážek, pokud jde o prostorová omezení, protože čím větší je dokument, tím více RAM používá a dokumenty MongoDB mají pevný limit velikosti 16 MB.
Obecným pravidlem je, že pokud je vzor dotazu vaší aplikace dobře známý a data mají tendenci být přístupná pouze jedním způsobem, vestavěný přístup funguje dobře. Pokud se vaše aplikace dotazuje na data mnoha způsoby nebo nejste schopni předvídat vzory dotazů na data, bude pro takový případ vhodný normalizovanější model odkazování na dokumenty.
Ref: