sql >> Database >  >> NoSQL >> MongoDB

Beste manier om meertalige database op mongodb weer te geven

U kunt een schema ontwerpen waarin u naar documenten kunt verwijzen of deze kunt insluiten. Laten we eens kijken naar de eerste optie van ingesloten documenten. Met uw bovenstaande toepassing kunt u de informatie als volgt in een document opslaan:

// 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"
        }
    ]
}

In het bovenstaande voorbeeldschema zou u in wezen de table1_lang . hebben ingesloten informatie in de hoofd table1 document. Dit ontwerp heeft zijn voordelen, waaronder datalokaliteit. Aangezien MongoDB gegevens aaneengesloten op schijf opslaat, zorgt het plaatsen van alle gegevens die u nodig hebt in één document ervoor dat de draaiende schijven minder tijd nodig hebben om naar een bepaalde locatie op de schijf te zoeken. Als uw toepassing vaak table1 gebruikt informatie samen met de table1_lang gegevens, dan wilt u vrijwel zeker de ingebedde route gaan. Het andere voordeel van ingesloten documenten is de atomiciteit en isolatie bij het schrijven van gegevens. Om dit te illustreren, stel dat u een document wilt verwijderen met een langtoets "name" met waarde "foo", dit kan met één enkele (atomaire) bewerking:

db.table.remove({"lang.name": "foo"});

Lees voor meer informatie over gegevensmodellering in MongoDB de documenten Inleiding Gegevensmodellering , in het bijzonder Model Een-op-veel-relaties met ingesloten documenten

De andere ontwerpoptie verwijst naar documenten waarin u een genormaliseerd schema volgt. Bijvoorbeeld:

// 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"
}

De bovenstaande aanpak geeft meer flexibiliteit bij het uitvoeren van query's. Om bijvoorbeeld alle onderliggende table1_lang . op te halen documenten voor de hoofdmoederentiteit table1 met id 3 zal eenvoudig zijn, maak gewoon een query tegen de verzameling table1_lang :

db.table1_lang.find({"table1_id": 3});

Het bovenstaande genormaliseerde schema met behulp van documentreferentiebenadering heeft ook een voordeel wanneer u een-op-veel-relaties hebt met een zeer onvoorspelbare ariteit. Als je honderden of duizenden table_lang . hebt documenten per give table entiteit, heeft inbedding zoveel tegenslagen wat betreft ruimtelijke beperkingen, want hoe groter het document, hoe meer RAM het gebruikt en MongoDB-documenten hebben een harde limiet van 16 MB.

De algemene vuistregel is dat als het querypatroon van uw toepassing bekend is en gegevens meestal maar op één manier worden benaderd, een ingebedde aanpak goed werkt. Als uw toepassing op veel manieren gegevens opvraagt ​​of u niet kunt anticiperen op de gegevensquerypatronen, is een meer genormaliseerd documentverwijzingsmodel geschikt voor dergelijke gevallen.

Ref:

MongoDB toegepaste ontwerppatronen:praktische use-cases met de toonaangevende NoSQL-database door Rick Copeland




  1. Aan de slag met Cloudera Data Platform Operational Database (COD)

  2. Hoe kan ik MongoWaitQueueFullException oplossen?

  3. RangeError:Ongeldige arraybufferlengte - Meteor JS

  4. Iets als een tag-cache en het opvragen om ze voor te stellen met Redis