Frage

Ich habe hierarchische Daten in dem Datenspeicher gespeichert unter Verwendung eines Modells, das wie folgt aussieht:

class ToolCategories(db.Model):  
   name = db.StringProperty()  
   parentKey = db.SelfReferenceProperty(collection_name="parent_category")  
   ...  
   ...  

Ich möchte alle Kategorienamen drucken, die Hierarchie zu bewahren, sagen wir in irgendeiner Form wie folgt aus:

--Information Gathering  
----OS Fingerprinting  
----DNS  
------dnstool  
----Port Scanning   
------windows  
--------nmap  
----DNS3  
----wireless sniffers  
------Windows  
--------Kismet  

Dazu die oben habe ich verwenden einfache Rekursion die Rückseite Referenzierung Fähigkeit verwenden:

class GetAllCategories (webapp.RequestHandler) :


        def RecurseList(self, object, breaks) :
                output = breaks + object.name + "</br>"
                for cat in object.parent_category:
                        output = output + self.RecurseList(cat, breaks + "--")

                return output



        def get (self) :
                output = ""
                allCategories = ToolCategories.all().filter(' parentKey = ', None)
                for category in allCategories :
                        output = output + self.RecurseList(category, "--")

                self.response.out.write(output)

Wie ich bin sehr neu zu App Engine-Programmierung (kaum 3 Tage, da ich das Schreiben von Code gestartet), bin ich nicht sicher, ob dies die optimierte Art und Weise aus der Datenspeicher-Zugriff Sicht den gewünschten Job zu tun.

Ist dies der beste Weg? wenn nicht, was ist?

War es hilfreich?

Lösung

Sie haben einen sehr vernünftigen Ansatz! Mein Haupt Nachteil sein würde, die wenig mit GAE und viel mit Python zu tun: nicht baut eine Reihe von Stücken mit + oder +=. Vielmehr machen Sie eine Liste von String-Stücke (mit append oder extend oder Listenkomprehensionen & c) und wenn du alles getan, was Sie es verbinden mit ''.join(thelist) für die endgültige Zeichenfolge Ergebnis oder dergleichen. Auch wenn die letzten Python-Versionen mich sehr bemühen, die intrinsisch O(N squared) Leistung der + oder += Schleifen, am Ende Sie sind immer besser dran, den Aufbau Listen von Zeichenkette auf dem Weg und ''.joining sie bis ganz am Ende!

zu optimieren

Andere Tipps

Der Hauptnachteil des Ansatzes ist, dass, weil Sie die „Adjazenzliste“ Art und Weise Bäume repräsentieren verwenden, müssen Sie für jeden Zweig des Baumes einer Datenspeicher-Abfrage tun. Datenspeicherabfragen sind ziemlich teuer (ca. 160ms each), so dass der Baum der Konstruktion, vor allem wenn es groß ist, könnte ziemlich teuer sein).

Es gibt einen anderen Ansatz, der im Wesentlichen die einen vom Datenspeicher für die Darstellung von Entitätsgruppen genommen ist: Anstatt nur den übergeordneten Schlüssel zu speichern, speichern Sie die gesamte Liste der Vorfahren eine Listproperty mit:

class ToolCategories(db.Model):
  name = db.StringProperty()
  parents = db.ListProperty(db.Key)

Dann den Baum zu konstruieren, können Sie die ganze Sache in einer einzigen Abfrage abzurufen:

q = ToolCategories.all().filter('parents =', root_key)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top