2016-12-28 3 views
0

Ich baue eine einfache Datenbank mit MongoDB und ich habe einige Fragen bezüglich einer effizienten Dokumentstruktur. Ich habe im Wesentlichen drei verschiedene Teile: Benutzer, Ereignisse und kostet. Sehen Sie sich meinen derzeitigen Ansatz an.Effiziente MongoDB Datenbankstruktur

{ 
    "first_name": "John", 
    "last_name": "Doe", 
    "email": "[email protected]", 
    "phone": "123456", 
    "events": [ 
    { 
     "_id": "*MongoId reference to event*", 
     "status": 0, 
     "owner": 1, 
     "costs": [ 
     { 
      "id": 1, 
      "name": "Test", 
      "amount": 59.99, 
      "created": "27/12/16 16:47:34 UTC", 
      "updated:": "27/12/16 16:47:34 UTC" 
     } 
     ], 
     "created": "27/12/16 16:47:34 UTC", 
     "updated": "27/12/16 16:47:34 UTC" 
    } 
    ], 
    "created": "27/12/16 16:47:34 UTC", 
    "updated": "27/12/16 16:47:34 UTC" 
} 

Mehrere Benutzer werden auf das gleiche Ereignis verbunden werden, damit die MongoID Referenz, sondern ein Kosten offensichtlich gehört nur ein Benutzer-Ereignis-Kombination. Ich habe einige Anwendungsfälle Beispiel:

  1. Liste ein Ereignis des Benutzers durch user_id (schnell)
  2. Liste Benutzer einer Veranstaltung von event_id (Geschwindigkeit?)
  3. Aufzählungs Kosten der Veranstaltung von event_id (Geschwindigkeit?)
  4. suchen Kosten von user_id, event_id und cost_id (schnell)

2 Fall verwenden würde und 3 in akzeptablen Grenzen sein und ist dies eine effiziente Struktur für meine Bedürfnisse?

Antwort

1

IMHO Ihr Ansatz ist richtig, soweit Denormalisierung geht, wo Sie Daten und Beziehung zusammenfügen möchten.

Das Problem, das ich hier sehe, ist, dass Sie Array von Objekt innerhalb eines Arrays von Objekt (Kosten innerhalb Ereignis) verwenden. Mongo-Abfragen sind in der Regel groß, sie sind jedoch bei verschachtelten Arrays nicht sehr effizient. Verschachtelte Objekte sind einfacher zu handhaben.

Das Einfügen eines Indexes in ein verschachteltes Array wäre ein Fehler und würde möglicherweise nicht die gewünschten Ergebnisse bringen.

Jetzt hängt es total von der Anforderung ab, die du gehen willst, aber wenn ich darüber nachdenken muss, würde mein Modell wie unten sein.

{ 
    "first_name": "John", 
    "last_name": "Doe", 
    "email": "[email protected]", 
    "phone": "123456", 
    "events": [ 
    { 
     "_id": "*MongoId reference to event*", 
     "status": 0, 
     "owner": 1, 
     "created": "27/12/16 16:47:34 UTC", 
     "updated": "27/12/16 16:47:34 UTC" 
    } 
    ], 
    "costs": [ 
     { 
      "id": 1, 
      "event_id": "*Appropriate event id*" 
      "name": "Test", 
      "amount": 59.99, 
      "created": "27/12/16 16:47:34 UTC", 
      "updated:": "27/12/16 16:47:34 UTC" 
     } 
     ], 
    "created": "27/12/16 16:47:34 UTC", 
    "updated": "27/12/16 16:47:34 UTC" 
} 

Zusätzlich würde ich Indizes für Ereignisse und Kosten aus Leistungsgründen setzen.

Die Profis Ich denke, dass es bei allen Anwendungsfällen fit ist, was die Leistung angeht, ist es einfacher, die Kostendaten basierend auf Benutzer- und Ereignis-ID zu aktualisieren.

Die Nachteile sind, dass Sie möglicherweise eine Zuordnung von Ereignis und Kosten auf Anwendungsebene tun müssen, zweitens, wenn Sie ein Ereignis löschen möchten, müssen Sie Update schreiben, um entsprechende Kosten zu entfernen. Zum Glück können beide in einem einzigen Update erreicht werden, das für ein einzelnes Dokument atomar ist.

Es könnte weitere Ansätze geben, aber irgendwo müssten Sie sich zwischendurch entscheiden.