Frage

Vor kurzem bin ich zu erforschen NoSQL-Datenbanken. Ich brauche eine Beratung darüber, wie Daten zu speichern, in dem optimalen und effizienten Weg für ein gegebenes Problem. Ich bin Targeting MongoDB, jetzt. Allerdings sollte es das gleiche mit CouchDB sein.

Nehmen wir an, wir haben diese drei Modelle:

Story:
 id
 title

User:
 id
 name

Vote:
  id
  story_id
  user_id

Ich möchte in der Lage, die Datenbank diese Fragen zu stellen:

  • Wer hat für diese News gestimmt hat?
  • Was diese Benutzer für? Abgestimmt hat

Ich mache einfach verbindet, während sie mit einer relationalen DB arbeiten. Die Frage ist, wie soll ich die Daten für diese Objekte ablegen, um zu sein am effizientesten ist.

Zum Beispiel, wenn ich die Abstimmung Objekte als Untersammlung von Geschichten speichern würde nicht es einfach, die Informationen zu bekommen -. „Was für ein Benutzer gewählt hat“

War es hilfreich?

Lösung

Ich würde vorschlagen, Stimmen als eine Liste von Geschichte _ids in jedem Benutzer zu speichern. Auf diese Weise können Sie herausfinden, welche Geschichten ein Benutzer für gerade abgestimmt, indem Sie in der Liste suchen. Um die Benutzer zu erhalten, die für eine Geschichte gestimmt haben Sie etwas tun können, wie:

db.users.find({stories: story_id})

wo story_id ist die _id der Geschichte in Frage. Wenn Sie einen Index für die stories Feld schaffen diese beiden Abfragen schnell sein.

Andere Tipps

  • keine Sorge, wenn Sie Ihre Anfragen effizient sind, bis sie an die Materie beginnt
  • nach unten Zitat, Sie tun es falsch
  

So wie ich über die gegangen sind   Geist Schalter ist über das vergessen   Datenbank alltogether. In dem   relationale db Welt Sie müssen immer   Sorgen über Datennormalisierung und   Ihre Tabellenstruktur. Graben sie alle.   Nur Layout Ihrer Webseite ein. legen sie sie   alle aus. Nun sie betrachten. Ihre   bereits 2/3 dort. Wenn Sie das vergessen   Vorstellung, dass die Datenbankgröße Angelegenheiten und   Daten sollten nicht als Ihre dupliziert werden   3/4 dort und Sie didnt haben sogar   schreiben Sie einen beliebigen Code! Lassen Sie Ihre Ansichten diktieren   Ihre Modelle. Sie müssen nicht nehmen   Ihre Objekte und sie machen 2   dimensional mehr als in der   relationale Welt. Sie können speichern   Objekte mit Form jetzt.

wie-zu-denken-in-Daten-Shops -instead-of-Datenbanken

Ok, Sie haven gegeben ein normalisiertes Datenmodell, wie Sie in einem SQL-Setup tun würden.

In meinem Verständnis Sie tun dies nicht in MongoDB. Sie könnten Referenzen speichern, aber Sie nicht aus Leistungsgründen im allgemeinen Fall.

Ich bin kein Experte in der NoSQL-Bereich in keiner Weise, aber warum Sie nicht einfach Ihren Bedürfnissen folgen und speichern die Benutzer (ids), die in den Geschichten Sammlung für eine Geschichte gestimmt haben und die Geschichte (ids) ein Benutzer in der Benutzer-Kollektion abgestimmt?

In CouchDB ist dies sehr einfach. Eine Ansicht aussendet:

function(doc) {
 if(doc.type == "vote") {
   emit(doc.story_id, doc.user_id);
 }
}

Eine andere Ansicht aussendet:

function(doc) {
 if(doc.type == "vote") {
   emit(doc.user_id, doc.story_id);
 }
}

Beide sind Abfragen extrem schnell, da es keine wird kommen. Wenn Sie Benutzerdaten oder Geschichte Daten benötigen, unterstützt CouchDB Multi-Dokument abgerufen werden. Auch recht schnell und ist eine Möglichkeit, eine „Join“.

zu tun

Ich habe mich in MongoDB und CouchDB viel in letzter Zeit, aber meine Einsicht ist begrenzt. Dennoch, wenn es um die Speicherung der Stimmen in der Geschichte Dokument zu denken, dass Sie die 4MB über Schlagen Dokument Größenbegrenzung sorgen. Auch wenn Sie nicht tun, könnten Sie immer wieder die Größe des Dokuments zu erhöhen genug, um es zu veranlassen, umgeworfen wird und somit verlangsamen Ihren schreibt (siehe, wie Dokumente in MongoDB bemessen werden).

Wie für CouchDB, diese Dinge sind sehr einfach, elegant, und recht schnell, wenn die Ansichtsindizes berechnet. Persönlich habe ich jedoch gezögert, weil von Benchmarks ein ähnliches Projekt in CouchDB zu tun, zeigt es schrittweise in erheblichem Maße zu verlangsamen, da die Datenbank wächst (und die Ansichtsindizes wachsen). Ich würde gerne einige neuere Benchmarks zeigen CouchDB Leistung als Datenbankgröße nimmt zu sehen. ICH WILL MongoDB oder CouchDB versuchen, aber SQL scheint immer noch so effizient und logisch, so dass ich mit ihm bleiben, bis das Projekt der Versuchung paßt genau richtig.

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