MongoDB

MongoDB ist die führende Open-Source, Document Datenbank die für einfache Entwicklung und Skalierung aber auch für Big Data Szenarien entwickelt wurde.

JSON Schema Validierung - Abhängigkeiten auf die man sich verlassen kann

Marc-David Militz
Experte
  • Artikel von Ken W. Alger

    • englischer Originalartikel
      https://www.mongodb.com/blog/post/json-schema-validation--dependencies-you-can-depend-on
      Übersetzung mit freundlicher Genehmigung von MongoDB


      Mit dem Thema JSON Schema Validierung haben wir uns ja schon in früheren Beiträgen, wie z.B. diesem hier, beschäftigt.
      https://www.qualiero.com/community/mongodb/mongodb-theorie/json-schema-validierung-ein-datenmodell-auf-clevere-art-festlegen.html
      Dabei haben wir betrachtet, wie man ein Schema definiert, Attribute zu Pflichtfeldern macht und diesen festen Datentypen zuweist.
      In einem weiteren Teil haben wir uns damit beschäftigt eindeutige Array-Objekte zu validieren.
      https://www.qualiero.com/community/mongodb/mongodb-theorie/json-schema-validierung-ueberpruefen-von-arrays.html
      Heute sehen wir uns einmal an, wie man Eigenschaften in einem Schema von anderen Eigenschaften abhängig macht.

      • Abhängigkeiten

        • Die Möglichkeit, ein Schema zu definieren, das von bestimmten Eigenschaften abhängig ist kann ein großer Vorteil sein.
          Damit wird es möglich Applikationslogik auf die Datenbank zu verlagern.
          Es gibt zwei Abhängigkeiten, die wir uns dafür etwas genauer ansehen sollten:
          - Eigenschaftsabhängigkeiten, die festlegen, dass bei Vorhandensein einer angegebenen Eigenschaft auch andere Eigenschaften vorhanden sein muss
          - Schemaabhängigkeiten, die eine Änderung im Schema definieren, wenn eine bestimmte Eigenschaft vorhanden ist

          • Eigenschaftsabhängigkeiten (Property Dependencies)

            • Ein beispielhafter Anwendungsfall für Property Dependencies sind Studenten.
              Wenn ein Student ein Programm abgeschlossen hat, möchten wir mit ihm in Kontakt bleiben und möchten, dass seine Postanschrift ein Pflichtfeld ist.
              Wenn sie noch keinen Abschluss haben, ist dies nicht erforderlich.
              db.students.drop()
              db.createCollection ( "students",
              {
              validator: {
              $jsonSchema: {
              bsonType: "object",
              required: ["name"],
              properties: {
              _id: {},
              name: {
              bsonType: ["string"],
              description: "'name' is a required string"
              },
              graduated: {
              bsonType: ["bool"],
              description: "'graduated' is an optional boolean value"
              }
              },
              dependencies: {
              graduated: ["mailing_address"]
              }
              }
              }
              })

              Durch das Hinzufügen des Schlüsselworts "dependencies" haben wir festgelegt, dass bei Abschluss die Adresse "mailing_address" angegeben werden muss.
              Hierbei ist zu beachten, dass diese Abhängigkeit nicht bidirektional ist. Daher funktioniert diese Einfügung weiterhin:
              db.students.insertOne({name: "Andrei Popov", mailing_address: "456 Oak Street"})

              Um die Abhängigkeiten bidirektional zu machen, müssten wir sie explizit definieren:
              ...
              dependencies: {
              "graduated": ["mailing_address"],
              "mailing_address": ["graduated"]
              }
              ...

              Mit diesen bidirektionalen Abhängigkeiten würde keiner dieser Einfügungen funktionieren:
              db.students.insertOne({name: "Jamal Aattou", graduated: true})

              db.students.insertOne({name: "Courtney DeSaja", mailing_address: "789 Broadway"})


              • Schemaabhängigkeiten (Schema Dependencies)

                • Schema Dependencies erweitern das Schema um zusätzliche Einschränkungen.
                  Wenn wir die Schemaabhängigkeit (schema dependency) anstelle der Einzelrichtungseigenschaftsabhängigkeit (single direction property dependency) verwenden, können wir die gleichen Ergebnisse wie folgt erzielen:
                  db.students.drop()
                  db.createCollection ( "students",
                  {
                  validator: {
                  $jsonSchema: {
                  bsonType: "object",
                  required: ["name"],
                  properties: {
                  _id: {},
                  name: {
                  bsonType: ["string"],
                  description: "'name' is a required string"
                  },
                  graduated: {
                  bsonType: ["bool"],
                  description: "'graduated' is an optional boolean value"
                  }
                  },
                  dependencies: {
                  graduated: {
                  required: ["mailing_address"],
                  properties: {
                  mailing_address: {
                  bsonType: ["string"]
                  }
                  }
                  }
                  }
                  }
                  }
                  })

                  Versuchen wir ein paar Datensätze in die Collection mit den folgenden definierten Regeln einzufügen:
                  db.students.insertOne({name: "Alena Weber", 
                  graduated: true,
                  mailing_address: "123 Main Street"})

                  db.students.insertOne({name: "Jamal Aattou", 
                  graduated: true})

                  db.students.insertOne({name: "Chris T. Barker",
                  mailing_address: "987 Pine St NE"})

                  In diesen Fällen werden Beispiel 1 und 3 erfolgreich in die Datenbank eingefügt, während Beispiel 2 fehlschlägt, weil das erforderliche Feld "mailing_address" fehlt.

                  • MongoDB Stitch Schema Validation

                    • Wenn Sie MongoDB Stitch verwenden, ist eine weitere Validierungsoption verfügbar.
                      Stich ermöglicht einen validierten Ausdruck (validate expression).
                      Diese Ausdrücke erhöhen die Leistung der Schemaüberprüfung, indem sie das Aufrufen von Stitch-Funktionen während des Überprüfungsprozesses ermöglichen.
                      Dies kann die Validierung von Änderungen an Dokumenten ermöglichen und den Zugriff auf vorherige Werte eines Felds ermöglichen.
                      Wenn Sie beispielsweise den "owner_id"-Wert eines Widgets aktualisieren möchten, können Sie eine Funktion aufrufen, um sicherzustellen, dass der neue Wert einem Eigentümer zugewiesen ist, dem kein Widget zugewiesen ist.

                      • Zusammenfassung

                        • Das flexible Dokumentenmodell von MongoDB ist eine der besten Funktionen der Datenbank, um Anwendungen schnell erstellen zu können.
                          Sobald ein Schema erstellt und für die Datenzugriffsleistung optimiert wurde, ist es häufig hilfreich, es für die Produktion "einfrieren" (lock it in) zu können.
                          Dies bietet viele potenzielle Vorteile, einschließlich:
                          - Die Einführung konkreter Meilensteine in der Evolution Ihres Datenmodells, an denen Sie sich messen können,
                          - Sicherstellen, dass keine unbeabsichtigten Änderungen am Schema vorgenommen wurden.
                          - Sicherstellen, dass in einem bestimmten Feld nur die erwarteten Datentypen oder Strukturen vorhanden sind.
                          - Akzeptiert nur zulässige, dem Schema entsprechende, Daten.

                          Mit den, in dieser JSON Schema Validation-Reihe verwendeten Techniken, haben Sie jetzt ein weiteres Tool in Ihrer MongoDB-Toolbox.
                          Verwenden Sie diese Techniken zur Schema Validierung, um die Leistungsfähigkeit des Dokumentmodells zu erweitern und Ihre Anwendungen noch besser zu machen.

Neueste Mitgliederaktivitäten

Tags

Diesen Community Beitrag weiterempfehlen