sql >> Databasteknik >  >> NoSQL >> MongoDB

Bästa sättet att representera flerspråkig databas på mongodb

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




  1. Anslut R till fjärransluten mongoDB med rmongodb

  2. MongoError:databasnamn kan inte innehålla tecknet ' ' när du använder mongoosejs connect to mLab

  3. Redis - Använder Incr-värde i en transaktion

  4. Hur filtrerar man en rad underdokument?