2016-04-20 6 views
7

Wir haben eine Multi-Tenant-Anwendung, die Azure DocumentDB als unsere dokumentenorientierte NoSQL-Datenbank verwendet.Speichern verschiedener Dokumenttypen in einer DocumentDb-Sammlung

Für multitenancy, lesen wir this question und this blog post. Da unsere Benutzerzahl derzeit nicht die Notwendigkeit erfüllt, verschiedene Datenbanken und/oder documentCollections zu verwenden, und noch wichtiger, um Kosteneinsparungen zu erzielen, haben wir Multitenancy mit einer "Where" -Klausel in einem TenantId-Feld mit einer documentCollection implementiert.

Ebenso, wenn es darum geht, „Dokumente“ oder „Objekte“ mit komplett unterschiedlicher Natur zu speichern (zum Beispiel sagen, Book und Car) wir uns auf die Tatsache in Frage stellen, eine documentCollection zu verwenden.

Zunächst sieht es vernünftiger aus, zwei verschiedene documentCollection für Book und Car zu erstellen. Die Erstellung eines documentCollection kostet jedoch 25 $ Minimum. Wir möchten nicht immer + 25 $ bezahlen, wenn wir ein neues Feature hinzufügen müssen, auch wenn es eine geringe Menge an Daten speichern soll (z. B. speichert unsere App viele Books, aber wenige Cars ...).

Ist es ein guter Entwurf, um Buch und Auto in das gleiche documentCollection zu setzen? Und behalten Sie einen Verweis auf den Typ des Dokuments in einem freigegebenen Mitglied (z. B. string Type ="Book" or string Type = "Car").

Mit dem Wissen, dass wir die Multitenancy bereits mit einer Where "-Klausel" implementiert haben, um alle Autos in unserer App für einen bestimmten Mieter abzufragen, würden unsere Abfragen alle Where TenantId ="XXXX" AND Type = "Car" enthalten.

Ich habe gesehen, dass DocumentDB jetzt die Partitioned Collection unterstützt. Könnte dies eine gute Verwendung der Partitionen sein, oder im Gegenteil, sie sollten beibehalten werden, um eine bessere Skalierbarkeit zu erreichen, und sind nicht geeignet, verschiedene Dokumenttypen zu trennen, deren Objektmengen möglicherweise nicht ähnlich sind?

Antwort

8

Ja, es ist "gutes Design" zu verwenden type="Book". Sie können auch isBook=true tun, was meiner Meinung nach etwas effizienter ist und Vererbung und Mixin-Verhalten ermöglicht.

Partitionierte Sammlungen sind eigentlich eine Möglichkeit, mehr Material in eine größere Einheit zu stecken als umgekehrt. Die Idee besteht darin, sowohl den Durchsatz (RUs) als auch den Speicherplatz zu skalieren, ohne dass Sie mehrere Collections selbst verwalten müssen. Sie könnten Ihren Partitionsschlüssel zu Ihrem type Feld machen, aber ich würde es nicht empfehlen. Partitionstasten sollten unter anderen Kriterien eine gleichmäßige Verteilung zwischen Partitionen ermöglichen.

+0

Vielen Dank für Ihre schnelle Antwort. Nur um sicher zu sein, wenn Sie schreiben "Partition Keys sollten in etwa zwischen den Partitionen verteilt ... unter anderen Kriterien." Sie meinen, dass Partitionsschlüssel verwendet werden, um eine "Partition von ungefähr ähnlicher Größe" zu erstellen? –

+0

Wir untersuchen auch Ihre Bibliothek [lumenize] (https://github.com/lmaccherone/documentdb-lumenize), um Aggregatfunktionen für DocumentDb zu aktivieren. Sieht sehr vielversprechend aus. –

+0

Ähnliche Größe und Durchsatz. Lass es mich wissen, wenn du Hilfe bei Lumenize brauchst. Ich überwache das Stack Overflow-Tag genauso wie dieses. –