Frage

Ich baue ein einfaches Abrechnungssystem, wo ein Benutzer viele Rechnungen hat. Jetzt versuche ich, zu entscheiden, ob Rechnungen sollten seine eigene Sammlung sein, oder innerhalb des Benutzers verschachtelt. Ich bin Neigung in Richtung der ehemaligen, aber ich habe noch nie irgendeine NoSQL Sachen getan, ich werde nur durch Versuch und Irrtum und was ich denke macht Sinn für mich.

Ich verstehe, dass Mongo eine 4mb Dokumentgröße Grenze hat, die ist, was macht ich denke, dass ich eine getrennte Sammlung von Rechnungen haben sollte, da diese täglich ansammeln und könnte schließlich eine große Menge an Platz.

Ich bin nur die Suche nach Meinungen über die Angelegenheit. Grundsätzlich werde ich für Rechnungen von einem Benutzer zwischen verschiedenen Datumsperioden werden Abfragen (wie Sie ein Abrechnungssystem tun würde sich vorstellen kann).

Nicht, dass es wirklich wichtig ist, aber ich bin mit Mongoid in einem Rails3 Projekt. Ich dachte, ich würde so etwas wie:

class User
  references_many :bills
end

class Bill
  referenced_in :user
end

sind Kommentare oder Designvorschläge sehr geschätzt.

War es hilfreich?

Lösung

1) In Bezug auf die 4MB Dokument Grenze, ist es das, was die "MongoDB: The Definitive Guide", sagt:

  

Dokumente, die größer als 4 MB (wenn zu BSON umgewandelt) nicht in der Datenbank gespeichert werden. Dies ist eine etwas willkürliche Grenze (und kann in Zukunft erhöht werden); es ist meist schlecht Schema-Design und eine konsistente Leistung zu verhindern. Um die BSON Größe (in Bytes) des Dokuments finden Sie unter doc , führen Object.bsonsize ( doc ) aus der Schale.

     

Um Ihnen eine Vorstellung davon, wie viel 4MB ist, der gesamte Text von Krieg und Frieden ist nur 3.14MB.

Am Ende hängt es davon ab, wie groß die Rechnungen für einen Benutzer erwarten zu wachsen. Ich hoffe, dass der Auszug oben gibt Ihnen eine Vorstellung der von der Dokumentgröße auferlegten Grenzen.

2) De-normalisierten Schema (Rechnungen gehen mit dem Benutzer-Dokument) ist der Weg zu gehen, wenn Sie wissen, dass Sie nie globale Abfragen auf Rechnungen (Beispiel für eine solche Abfrage ausführen werden, wenn Sie die zehn abrufen möchten jüngste Rechnungen in das System eingegeben). Sie müssen verwenden Karten reduzieren Ergebnisse für solche Abfragen abzurufen, wenn Sie ein denormalisierter Schema verwenden.

Normalized-Schema (Benutzer und Rechnungen in separaten Dokumenten) ist eine bessere Wahl, wenn Sie Flexibilität wollen, wie die Rechnungen abgefragt werden. Da jedoch MongoDB keine Unterstützung verbindet, werden Sie jedes Mal, wenn Sie an einen Benutzer entsprechen, um die Rechnungen abrufen möchten mehrere Abfragen auszuführen haben.

In Anbetracht der Use-Case Sie erwähnt haben, ich mit de-normalisierten Schema gehen würde.

3) Alle Updates in MongoDB sind atomar und serialisiert. Das sollte Steves Anliegen beantworten.

Sie können diese Folien hilfreich. http://www.slideshare.net/kbanker/mongodb-meetup

Sie können auch auf MongoDB Seite Produktion Deployments aussehen. Sie können die SF.net Dias hilfreich.

Andere Tipps

Eine Frage, die Sie betrachten möchten vielleicht ist, wird es jemals eine Zeit geben, in denen Sie die Rechnungen zu verweisen brauchen werden einzeln abgesehen von ihrer Mitgliedschaft in einem Benutzer? Wenn ja, wird es einfacher sein, wenn sie eine unabhängige Existenz haben.

Abgesehen davon, dass die Größenbeschränkung Problem, das Sie bereits identifiziert hat, ist ein guter Grund, sie weg zu spalten.

Es könnte ein Transaktions Problem auch sein, wenn Sie einen großen Anzahl von Benutzern mit vielen enthielten Rechnungen schreiben, was passiert, wenn man einigermaßen gleichzeitiges Schreiben von Änderungen an die gleichen Benutzer aus verschiedenen Verbindungen erhalten? Ich weiß nicht genug über Mongo zu wissen, wie es wäre zu beheben diese - meine Vermutung wäre, dass, wenn die Schreib verschiedene hinzugefügt Rechnungen enthalten Sie beide bekommen würden, aber wenn sie verschiedene Änderungen in bestehenden Rechnungen enthalten würden Sie Überschreibungen erhalten - hoffentlich wird jemand anderes dazu sagen, aber zumindest würde ich es testen. Wenn Sie die Rechnungen an eine separate Sammlung schreibst ist dies kein Problem.

Sie waren bereits eine lange Zeit, da diese Frage geklärt ist, aber ich es zu tun hatte mit etwas ähnliches und ich dachte, meine Erkenntnisse für alle hinzufügen, sonst würde dieses Problem untersucht.

Mein Verständnis ist, dass das 4MB Dokument in Versionen zu 16 MB erweitert wurde 1.8+. Dies war von einer Videopräsentation von Banker, der als einer der MongoDB Mitglieder. Ich habe diesen Wert nicht überprüft, aber sein Wort dafür nehme (da er hoffentlich weiß, was er spricht).

In Bezug auf die Frage, was passiert, wenn mehrere Updates auf dem gleichen Benutzer mit eingebetteten Rechnungen auftreten ... wieder aus der gleichen Video-Präsentation, vorausgesetzt, die Antwort ist, dass MongoDB die Info-Updates so schnell, dass es in der Regel kein Problem dar. Die MongoDB-Instanz wird gesperrt, während die Updates stattfinden, so dass mehrere Updates sollte kein Problem sein.

Eine Sorge, die ich über eingebettete Dokumente hatte, dass sie nicht unabhängig behandelt werden können, ihre Mutter Dokument. Dies ist meiner Meinung nach, macht Dokumente eingebettet ziemlich wertlos. Sie sind nur nützlich für Nischen Fälle, erfüllen spezifische Anwendungsfälle.

Ich persönlich finde, dass MongoDB (und NoSQL DBs) für bestimmte Fälle nützlich ist, aber die traditionelle SQL / RDMSs ist noch besser für die Mehrheit der Fragen. Wenn Sie jemanden wie Craigslist und ein Schema Änderung Sie 2 Monate dauert auf Ihre archivierten Daten laufen, dann ja, MongoDB und NoSQL macht Sinn. aber für die überwiegende Mehrheit der Anwendungen Ich glaube nicht, dass Datenmenge Handhabung wird ein wichtiges Anliegen sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top