2009-03-03 8 views
3

Ich verwende Mnesia mit Erlang, aber diese Frage gilt für jeden Schlüsselwert db wie couchdb usw.Wie entwerfen Sie ein Schema, um verschachtelte Elemente in einer Schlüsselwertdatenbank effizient abzufragen?

Ich versuche, sich zu befreien von der RDBMS-Prozess gedacht, aber ich kann meine nicht wickeln gehen Sie darum herum, wie Sie diese Art von Schema effizient implementieren können.

sagen, dass ich einen Benutzerdatensatz haben, und er viele SubItemA Aufzeichnungen hat, die viele SubItem B Aufzeichnungen hat, so:

User 
-SubItem A 
--SubItem B 
... 

Ich brauche Abfragen auf SubItem B. laufen ist es effizient, es zu tun wenn es ist das verschachtelt? Soll ich es einfach normalisieren, damit es schneller geht?

Ich habe von einigen Leuten mit Datenduplikation gehört, so dass die Daten sowohl verschachtelt und getrennt sind, ist das lächerlich oder ist das tatsächlich nützlich in einige Fälle?

Antwort

3

Die zugrunde liegende Frage ist, wann ist die Leistung gut genug?

Das Durchsuchen des Benutzerwörterbuchs mit Tabellen ist kein übermäßiger Aufwand, wenn Sie wirklich jedes Unterobjekt B im Detail untersuchen müssen und die Größe der B's die Gesamtgröße des Wörterbuchs dominiert.

Wenn das nicht gut genug ist, normalisieren es so können Sie vermeiden, in allen Benutzer lesen und SubItem Daten vorne, wenn Sie SubItem B. Verwendung einer Verbindung Schlüssel wie (UserId, SubItemAId, SubItemBId) sind abfragt Wenn die Tabelle im SubItem B-Wörterbuch geordnet ist, können Sie Bereichsabfragen ausführen.

Wenn dies die Abfrageleistung von User/SubItem A vollständig zunichte macht, dann betrachten Sie die Datenduplizierung als letzten Ausweg, da sie fehleranfälliger ist.

1

In CouchDb wäre es trivial, View-Einträge für jedes der SubItems zu emittieren. Dies würde Ihnen sehr schnellen Zugriff auf diese Elemente geben. Je nachdem, was Sie auch in die View-Einträge eingeben, können Sie wahrscheinlich alle Informationen angeben, die Sie für die Verknüpfung mit übergeordneten Dokumenten/Unterelementen benötigen.

1

Ich bin nicht sicher über Mnesia, und ich bin gerade erst mit CouchDB, aber mein Verständnis ist, dass in CouchDB, da Sie Ihre eigenen benutzerdefinierten Indizes ("Ansichten") generieren, können Sie einfach einen Index erstellen auf diesen Unterpunkten.

Ein Beispiel Kartenfunktion:

function(doc) { 
    for(var i in doc.subitems_a) { 
     var subitem_a = doc.subitems_a[i]; 

     for(var j in doc.subitems_a[item_a].subitems_b) { 
      var subitem_b = subitem_a.subitems_b[j]; 

      emit(subitem_b, doc) 
     } 
    } 
} 

, die effektiv eine indizierte Auflistung der SubItem Bs und dann könnten Sie schneiden und aus dieser Auflistung splice wie Sie wählen.

0

Eigentlich hängt es von der Datenbank ab, die Sie verwenden, denke ich. In CouchDB wird eine Sache besser funktionieren, während in Mnesia etwas anderes besser wäre. Sollten Sie die Daten partitionieren und sharden? Nach welchen Kriterien sollten Sie dies tun? Wie viel Datenduplizierung ist genug?

Wie Jeffery Hantin sagte, wird es einige Experimente und Analysen brauchen, um die richtige Lösung zu finden. Das heißt, dass die meisten der nicht-relationalen Datenbanken da draußen Ihnen die Tools zur Verfügung stellen, die Sie benötigen, um das Problem zu lösen. Ihr Teil ist herauszufinden, die Kompromisse von jedem und welche Abwägung Sie gegenüber den anderen akzeptieren können.

Verwandte Themen