2010-01-31 12 views
48

Welche Best Practices gelten für NoSQL-Datenbanken, OODBs oder andere Akronyme?NoSQL-Best Practices

Zum Beispiel habe ich oft gesehen, ein Feld "Typ" verwendet wird, um zu entscheiden, wie das DB-Dokument (in couchDB/mongoDB Begriffe) vom Client, die Anwendung interpretiert werden soll.

Verwenden Sie gegebenenfalls PHP als Referenzsprache. Lesen: Ich bin auch daran interessiert, wie solche Daten am besten auf der Client-Seite gehandhabt werden können, nicht nur strikt die DB-Struktur. Das bedeutet praktisch, dass ich auch nach Mustern wie "ORM" s für SQL DBs suche (Active Record, Data Mapper, etc).

Zögern Sie nicht, Aussagen darüber zu machen, wie eine solche DB und die neuen Funktionen von PHP 5.3 am besten zusammen funktionieren könnten.

Antwort

36

Ich denke, dass derzeit die ganze Idee der NoSQL-Daten speichert und das Konzept der Dokumentendatenbanken ist so neu und anders als die etablierten Ideen, die relationalen Speicher treiben, dass es derzeit sehr wenige (wenn überhaupt) Best Practices gibt.

Wir wissen an dieser Stelle, dass die Regeln für die Speicherung Ihrer Daten innerhalb von CouchDB (oder einer anderen Dokumentendatenbank) sich von denen für relationale unterscheiden. Zum Beispiel ist es eine Tatsache, dass Normalisierung und das Streben nach 3NF nicht etwas ist, wonach man streben sollte. Eines der üblichen Beispiele wäre das eines einfachen Blogs.

In einem relationalen Speicher haben Sie jeweils eine Tabelle für "Beiträge", "Kommentare" und "Autoren". Jeder Autor hätte viele Posts, und jeder Post hätte viele Kommentare. Dies ist ein Modell, das gut genug funktioniert und über jeden relationalen DB gut abbildet. Das Speichern der gleichen Daten in einer docDB würde jedoch sehr wahrscheinlich anders aussehen. Sie haben wahrscheinlich so etwas wie eine Sammlung von Post-Dokumenten, von denen jedes seinen eigenen Autor und eine Sammlung von Kommentaren enthält. Natürlich ist das wahrscheinlich nicht die einzige Möglichkeit, dies zu tun, und es ist ein Kompromiss (jetzt Die Suche nach einem einzelnen Post ist schnell - Sie machen nur eine Operation und erhalten alles zurück. Sie haben jedoch keine Möglichkeit, die Beziehung zwischen Autoren und Posts zu erhalten (da dies alles Teil des Post-Dokuments wird).

Ich habe auch Beispiele gesehen, die ein "type" -Attribut verwenden (in einem CouchDB-Beispiel). Klar, das klingt nach einem gangbaren Ansatz. Ist es der beste? Ich habe keine Ahnung. Natürlich würden Sie in MongoDB separate Sammlungen in einer Datenbank verwenden, was das Attribut type zu totalem Unsinn macht. In CouchDB obwohl ... vielleicht ist das am besten. Die anderen Alternativen? Getrennte Datenbanken für jeden Dokumententyp? Das scheint ein bisschen langweilig, also würde ich mich selbst auf die "Typ" -Lösung konzentrieren. Aber das bin nur ich. Vielleicht gibt es etwas Besseres.

Mir ist klar, dass ich hier ziemlich viel geredet habe und sehr wenig gesagt habe, wahrscheinlich nichts, was du nicht schon wusstest. Mein Punkt ist dies jedoch - ich denke, es liegt an uns, mit den Werkzeugen, die wir haben, und den Daten, mit denen wir arbeiten, zu experimentieren und im Laufe der Zeit werden die guten Ideen verbreitet und werden die besten Praktiken. Ich denke nur, dass du ein bisschen zu früh im Spiel fragst.

+2

Sie haben recht: Es ist zu früh, genau wie ich es mir gedacht habe. +1, aber ich werde noch eine Weile auf andere Meinungen warten. – Flavius

+1

Wie ich es so weit sehe, hängt es stark von den Operationen ab, die Sie mit den Daten machen wollen und wie oft die Anwendung diese Operationen unter normalen Umständen durchführen würde. Zum Beispiel wäre das Einbetten von Kommentaren in einen "Beitrag" nicht optimal, wenn die App eine Funktionalität zum "Stalken" einer bestimmten Person (wie "Tweets") einrichten würde. – Flavius

+1

Sicher. Ich denke, dass alle Best Practices, die sich ergeben, auf der Art und Weise basieren, wie die Daten genutzt werden sollen. Es sollten unterschiedliche Entscheidungen und Kompromisse getroffen werden, um diese Anforderungen bestmöglich zu erfüllen. –

6

"NoSQL" sollte mehr zum Erstellen des Datenspeichers, um Ihre Anwendung Anforderungen zu folgen, nicht zum Erstellen der App eine bestimmte Struktur folgen - das ist eher wie eine traditionelle SQL-Ansatz.

Verlassen Sie eine relationale Datenbank nicht "nur weil"; mach es nur, wenn deine App es wirklich braucht.

+0

Ich habe nie gesagt, ich wollte etwas bauen, um etwas anderes zu folgen. Ich habe nach den besten Mustern gesucht, die Sie erfolgreich eingesetzt haben, damit die Dinge am besten zusammenpassen. Im Idealfall mit den Funktionen von PHP 5.3.Außerdem suche ich keine Ratschläge, ob relationale oder dokumentorientierte DBs verwendet werden sollen. – Flavius