Frage

Gute Nachrichten! Seit Version 4.8 BerkeleyDB hat c # Schnittstelle. BerkeleyDB ist eine ganz interessante Sache für mich aufgrund seiner Nicht-SQL Natur. Ich weiß, es ist ein ausgezeichnetes Werkzeug, wenn jemand eine Menge von Schlüssel / Wert-Paare speichern möchte. Und ich weiß, über ‚aufsteckbare‘ Tabellen. Was ich nicht weiß, wie man mit BerkeleyDB hierarchischen Daten zu speichern. Ist es geeignet für diese im Allgemeinen?

Was ich tun möchte? Ich möchte dmoz.org Daten speichern. Jetzt habe ich alle TEUR rdfs zu MySQL db importiert. Aber ich brauche nicht gespeicherte Prozeduren oder andere komplexe Funktionen. Ich möchte für meine Online-RSS-Reader BerkeleyDB als Datenspeicher verwenden. So gibt es Feeds in einem Kategoriebaum (wie i Kategorien sagte ich aus dmoz importiert haben, und ich habe eine Menge von ihnen, sowie Feeds -. Millionen). Und ... ich vergaß über Feed-Einträge. Ich möchte sie speichern auch mit BerkleyDB :-).

Es ist aussehen wie ich alle Beziehungen manuell implementieren ,,, Es ist ok ... Aber das Wichtigste über die ich frage, ist die Geschwindigkeit. Will (kann) meine Lösung mit BerkeleyDB dann auf MySQL Basis einer schneller sein (oder auf irgendwelche RDBMS im Allgemeinen)?

War es hilfreich?

Lösung

Es ist für das, aber es kann mehr Arbeit, als Sie bereit sind, in setzen. BerkeleyDB ein sehr allgemeiner Schlüssel / Wert-Speicher, also alles, was Sie tun, sagen „für Taste X, speichert Wert Y“. Später können Sie „Gib mir den Wert des Schlüssel X“ sagen und es werden Sie zurück Y. Das ist wirklich alles tut es von einem hohen Niveau. Es hat eine sehr robuste Funktionen für wichtige Zuverlässigkeitseigenschaften garantiert (die so genannte Säure, Unteilbarkeit, Konsistenz, Isolation und Dauerhaftigkeit) und eine gute Leistung, aber aus der Sicht der Programmierer, es ist eine einfache Map-Struktur.

Also ja, können Sie Bäume speichern, aber Sie müssen auf eine gute Darstellung für sie entscheiden. Sie können für Integer-Schlüssel gehen (stellen Sie sicher, sie im Big-Endian-Byte-Reihenfolge gespeichert sind, weil BDB lexikographische Ordnung auf Schlüssel verwendet) und haben einfach eine Struktur als Wert eine Liste von ganzen Zahlen für Kinder enthält. Sie müssten noch alle Ihre Traversal-Algorithmen von Hand schreiben, though. obwohl, ohne zu wissen, welche Anforderungen Sie für Ihre hierarchischen Daten haben, ist es schwer, einen konkreten Vorschlag zu geben.

speedwise, für das, was es Berkeley DB wird wahrscheinlich nicht viel schneller erhalten können (das heißt, Sie werden nicht viel da draußen finden, dass ist schneller, vor allem, wenn Sie bereit sind, einige der ACID-Eigenschaften zu opfern). Es gibt Ihnen fast vollständige Kontrolle über Ihre Schnittstelle zu der Karte, so theoretisch könnten Sie wahrscheinlich eine hoch optimierte Struktur für Ihren speziellen Anwendungsfall bauen. Um jedoch die Low-Level-Schnittstelle gegeben, wenn Sie die Umsetzung schließt sich, komplexe Filterabfragen, oder jede Art von nicht-triviale Abfragesprache oben drauf, Sie haben einige sehr schnellen Code und Algorithmen schreiben mit dem großen Schritt zu halten relationale Datenbanken gibt.

Wenn Ihre Daten von XML modelliert werden (eugh, aber ich kenne einige Leute, wie es), gibt es eine bestehende Datenbank auf der BDB gebaut namens BDB XML (auch von Sleepycat, jetzt Teil von Oracle). Auf diese Weise können Sie in der Datenbank beliebige XML-Dokumente speichern und schnell XPath und XQuery-Abfragen auf der Datenbank auszuführen. Ich glaube nicht, dass es eine offizielle .NET API dies noch nicht, aber ich bin mir ziemlich sicher, dass ich auf eine inoffizielle .NET gekommen sind, die Bindung an sie.

In der Regel, wenn Sie einige sehr besondere Anforderungen haben, die bestehenden Lösungen gibt nicht erlauben (dies scheint nicht der Fall mit Ihrem Szenario zu sein), würde ich davon abraten, Ihre eigene Datenbank rollen (auch oben gebaut von BDB), wenn Sie mit effizienten Algorithmen und Code-Optimierung sehr erfahren sind. Wenn Sie die Speicherung RDF Tripel, gibt es spezielle Datenbanken für das, und auch relationale Datenbanken sind nicht besonders ungeeignet für sie. BDB XML ist nach wie vor eine tragfähige Lösung für das auch. Es ist letztlich Ihre Wahl, aber wenn ich Ihr wäre, würde ich wählen, um auf den interessanteren Problemen zu arbeiten, ohne mit Low-Level-Datenbankoperationen beschäftigen (und würde somit eine dünne Schicht über bestehendes Paket für meinen eigentlichen RDF-Speicher verwenden).

Andere Tipps

Hierarchische Strukturen können in Schlüsselwert speichert mit einem Elternteil oder Kind Attribute gespeichert werden.

Wenn Sie ein Elternteil haben wollen 1 oder mehr Kinder, verwenden Sie ein übergeordnetes Attribut auf jeden Datensatz und haben Wurzelknoten haben einen Elternteil von ID 0 oder einem anderen sinnvollen Wert.

Wenn Sie ein Kind 1 oder mehr haben Eltern, auf jedem Datensatz ein Kind Attribut verwenden.

Wenn Sie Knoten mehrere Eltern haben, und Kinder verwenden eine separate Tabelle, die die Beziehungen zu speichern.

Auf diese Weise können Sie den Baum von durch Abfragen für Knoten durchqueren können, die einen bestimmten Elternteil oder Kind hat.

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