التسلسل الهرمي الأمثل على جوجل appengine Datastore
-
06-07-2019 - |
سؤال
لدي هرمية البيانات المخزنة في مخزن البيانات باستخدام نموذج الذي يبدو مثل هذا:
class ToolCategories(db.Model):
name = db.StringProperty()
parentKey = db.SelfReferenceProperty(collection_name="parent_category")
...
...
أريد أن طباعة كل فئة أسماء الحفاظ على التسلسل الهرمي ، ويقول في بعض شكل مثل هذا :
--Information Gathering
----OS Fingerprinting
----DNS
------dnstool
----Port Scanning
------windows
--------nmap
----DNS3
----wireless sniffers
------Windows
--------Kismet
للقيام أعلاه استخدمت بسيطة العودية باستخدام الرجوع القدرة:
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)
كما أنا جديدة جدا التطبيق محرك البرمجة (بالكاد 3 أيام منذ أن بدأت كتابة التعليمات البرمجية), أنا لست متأكدا مما إذا كان ذلك الأمثل من مخزن البيانات الوصول إلى نظر للقيام الوظيفة المطلوبة.
هذا هو أفضل طريقة ؟ إن لم يكن ما هو ؟
المحلول
لديك نهجا معقولا جدا!بلدي التحذير الرئيسي سيكون واحدا لا علاقة لها مع جي والكثير مع بيثون: لا بناء سلسلة من القطع مع +
أو +=
.بدلا من ذلك ، يمكنك تقديم قائمة من سلسلة قطع (مع append
أو extend
أو قائمة comprehensions &c) و عندما كنت فعلت كل ما يمكنك الانضمام إلى هذا النهائي السلسلة النتيجة مع ''.join(thelist)
أو ما شابه ذلك.على الرغم الأخيرة إصدارات بيثون جاهدين لتحسين جوهريا O(N squared)
أداء +
أو +=
الحلقات, في النهاية انت دائما الأفضل بناء قوائم السلاسل على طول الطريق ، ''.join
ing لهم في النهاية!
نصائح أخرى
والعيب الرئيسي في نهجكم هو أن لأنك كنت تستخدم "قائمة الجوار" وسيلة لتمثيل الأشجار، ما عليك القيام به الاستعلام مخزن البيانات واحد لكل فرع من فروع الشجرة. استفسار مخزن البيانات غالية الثمن نسبيا (حوالي 160ms لكل منهما)، وذلك بناء على شجرة، وخاصة إذا كان كبير، يمكن أن تكون مكلفة نوعا ما).
وهناك نهج آخر، والتي هي في جوهرها واحد من مخزن البيانات التي اتخذت لتمثيل مجموعة كيان: بدلا من مجرد تخزين المفتاح الأصل، تخزين قائمة كاملة من أسلاف باستخدام ListProperty:
class ToolCategories(db.Model):
name = db.StringProperty()
parents = db.ListProperty(db.Key)
وبعد ذلك، لبناء شجرة، يمكنك استرداد شيء كامل في استعلام واحد:
q = ToolCategories.all().filter('parents =', root_key)