MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Beste Möglichkeit, eine mehrsprachige Datenbank auf Mongodb darzustellen

Sie können entweder ein Schema entwerfen, in dem Sie Dokumente referenzieren oder einbetten können. Schauen wir uns die erste Option der eingebetteten Dokumente an. Mit Ihrer obigen Anwendung können Sie die Informationen wie folgt in einem Dokument speichern:

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

Im obigen Beispielschema hätten Sie im Wesentlichen table1_lang eingebettet Informationen in der Haupt-table1 dokumentieren. Dieses Design hat seine Vorzüge, einer davon ist die Datenlokalität. Da MongoDB Daten zusammenhängend auf der Festplatte speichert, stellt das Einfügen aller benötigten Daten in ein Dokument sicher, dass die sich drehenden Festplatten weniger Zeit benötigen, um nach einem bestimmten Ort auf der Festplatte zu suchen. Wenn Ihre Anwendung häufig auf table1 zugreift Informationen zusammen mit table1_lang Daten, dann werden Sie mit ziemlicher Sicherheit den eingebetteten Weg gehen wollen. Der andere Vorteil eingebetteter Dokumente ist die Unteilbarkeit und Isolation beim Schreiben von Daten. Nehmen wir zur Veranschaulichung an, Sie möchten ein Dokument entfernen, das einen Langschlüssel "name" mit dem Wert "foo" hat, dies kann mit einer einzigen (atomaren) Operation erfolgen:

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

Weitere Einzelheiten zur Datenmodellierung in MongoDB finden Sie in den Dokumenten Einführung in die Datenmodellierung , insbesondere Modell 1:n-Beziehungen mit eingebetteten Dokumenten

Die andere Entwurfsoption ist das Referenzieren von Dokumenten, bei denen Sie einem normalisierten Schema folgen. Zum Beispiel:

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

Der obige Ansatz bietet eine erhöhte Flexibilität beim Durchführen von Abfragen. Zum Beispiel, um alle untergeordneten table1_lang abzurufen Dokumente für die Hauptentität table1 mit id 3 ist unkompliziert, erstellen Sie einfach eine Abfrage für die Sammlung table1_lang :

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

Das obige normalisierte Schema mit Dokumentverweisansatz hat auch einen Vorteil, wenn Sie Eins-zu-Viele-Beziehungen mit sehr unvorhersehbarer Häufigkeit haben. Wenn Sie Hunderte oder Tausende von table_lang haben Dokumente pro geben table Entity hat das Einbetten so viele Rückschläge in Bezug auf räumliche Beschränkungen, denn je größer das Dokument ist, desto mehr RAM wird verwendet und MongoDB-Dokumente haben eine feste Größenbeschränkung von 16 MB.

Als allgemeine Faustregel gilt, dass ein eingebetteter Ansatz gut funktioniert, wenn das Abfragemuster Ihrer Anwendung bekannt ist und auf die Daten in der Regel nur auf eine Weise zugegriffen wird. Wenn Ihre Anwendung Daten auf viele Arten abfragt oder Sie die Datenabfragemuster nicht vorhersehen können, ist für diesen Fall ein stärker normalisiertes Dokumentreferenzierungsmodell geeignet.

Ref:

MongoDB Applied Design Patterns:Praktische Anwendungsfälle mit der führenden NoSQL-Datenbank von Rick Copeland