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

Modellierung von Many-to-Many:through mit Mongoid/MongoDB

Die Modellierung eines guten Mongodb-Schemas hängt wirklich davon ab, wie Sie auf Ihre Daten zugreifen. In Ihrem beschriebenen Fall indizieren Sie Ihren Mitgliedschaftsschlüssel „memberships.user_id“, was in Ordnung zu sein scheint. Aber Ihre Dokumentgröße wird wachsen, wenn Sie Betrachter, Bearbeiter und Administratoren hinzufügen. Außerdem erschwert Ihr Schema Abfragen wie:

Projekte abfragen, bei denen user_id xxx Bearbeiter ist:

Auch hier müssen Sie Projekte wie dieses möglicherweise nicht abfragen, sodass Ihr Schema gut aussieht. Aber wenn Sie Ihre Projekte nach user_id UND Rolle abfragen müssen, würde ich Ihnen empfehlen, eine 'project_membership'-Sammlung zu erstellen:

db.project_memberships.insert(
  { 
    "project_id" : ObjectId("4d730fcfcedc351d67000032"),
    "editors" : [
      ObjectId("4d730fcfcedc351d67000002"),
      ObjectId("4d730fcfcedc351d67000004")
    ],
    "viewers" : [
      ObjectId("4d730fcfcedc351d67000002"),
      ObjectId("4d730fcfcedc351d67000004"),
      ObjectId("4d730fcfcedc351d67000001"),
      ObjectId("4d730fcfcedc351d67000005")
    ],
    "administrator" : [
      ObjectId("4d730fcfcedc351d67000011"),
      ObjectId("4d730fcfcedc351d67000012")
    ]
  }
)

db.project_memberships.ensureIndex({"editors": 1})
db.project_memberships.ensureIndex({"viewers": 1})
db.project_memberships.ensureIndex({"administrator": 1})

Oder noch einfacher ... fügen Sie Ihrem Projektschema einen Index hinzu:

db.projects.ensureIndex({"memberships.role": 1})