sql >> Databáze >  >> NoSQL >> MongoDB

Nejlepší způsob, jak reprezentovat vícejazyčnou databázi na mongodb

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:

Aplikované návrhové vzory MongoDB:Praktické případy použití s ​​přední NoSQL databází od Ricka Copelanda




  1. nelze se připojit k mongodb hostovanému na vzdáleném serveru pomocí monk

  2. Mongodb:řazení dokumentů podle objektů pole

  3. Jak jsou seřazeny hodnoty null v indexu MongoDB?

  4. Jak mohu změnit pole _id v kolekci MongoDB na User_id?