سؤال

مشكلة المثال:

جهات:

  • يحتوي المستخدم على الاسم وقائمة الأصدقاء (مراجع المستخدم)
  • يحتوي منشور المدونة على العنوان والمحتوى والتاريخ والكاتب (المستخدم)

متطلبات:

أريد صفحة تعرض العنوان ورابطًا إلى مدونة آخر 10 مشاركات كتبها صديق المستخدم.أود أيضًا أن أتمكن من الاحتفاظ بالترحيل من خلال الإدخالات القديمة.

حل SQL:

لذلك في أرض SQL سيكون الأمر مثل:

select * from blog_post where user_id in (select friend_id from user_friend where user_id = :userId) order by date

حلول GAE التي يمكنني التفكير فيها هي:

  • قم بتحميل المستخدم، وتصفح قائمة الأصدقاء وقم بتحميل أحدث منشورات مدونتهم.أخيرًا، قم بدمج جميع منشورات المدونة للعثور على أحدث 10 إدخالات في المدونة
  • في منشور المدونة، لديك قائمة بجميع المستخدمين الذين لديهم كاتب كصديق.قد يعني هذا قراءة بسيطة ولكنه قد يؤدي إلى زيادة في الحصص عند إضافة صديق لديه الكثير من منشورات المدونة.

لا أعتقد أن أيًا من هذه الحلول سوف يتوسع.

أنا متأكد من أن الآخرين واجهوا هذه المشكلة ولكني بحثت وشاهدت مقاطع فيديو google io وقرأت أكواد الآخرين ...ماذا ينقصني؟

هل كانت مفيدة؟

المحلول 2

تمت تغطية هذا الموضوع في محادثة Google io:http://code.google.com/events/io/sessions/BuildingScalableComplexApps.html

يقترح فريق Google بشكل أساسي استخدام خصائص القائمة وما يسمونه كيانات الفهرس العلائقي، ويمكن العثور على مثال للتطبيق هنا: http://pubsub-test.appspot.com/

نصائح أخرى

إذا نظرت إلى كيفية تنفيذ حل SQL الذي قدمته، فسوف يكون الأمر كما يلي:

  1. جلب قائمة الأصدقاء للمستخدم الحالي
  2. لكل مستخدم في القائمة، ابدأ فحص الفهرس للمشاركات الأخيرة
  3. دمج-ضم جميع عمليات الفحص من الخطوة 2، ويتوقف عند استرداد ما يكفي من الإدخالات

يمكنك تنفيذ نفس الإجراء تمامًا بنفسك في App Engine، وذلك باستخدام مثيلات الاستعلام كمكررات والقيام بدمج الدمج عليها.

أنت على حق في أن هذا لن يتناسب بشكل جيد مع عدد كبير من الأصدقاء، ولكنه يعاني من نفس المشكلات التي يواجهها تطبيق SQL تمامًا، ولكنه لا يخفيها أيضًا:إن جلب آخر 20 إدخالاً (على سبيل المثال) يكلف تقريبًا عمل O(n log n)، حيث n هو عدد الأصدقاء.

"قم بتحميل المستخدم، وتصفح قائمة الأصدقاء، وقم بتحميل أحدث منشورات مدوناتهم."

هذا كل ما في الأمر أن الصلة هي حلقات متداخلة.بعض أنواع الصلات عبارة عن حلقات تحتوي على عمليات بحث.معظم عمليات البحث هي مجرد حلقات؛بعضها تجزئات.

"أخيرًا، قم بدمج جميع منشورات المدونة للعثور على أحدث 10 إدخالات في المدونة"

هذا أمر BY مع حد.هذا ما تفعله قاعدة البيانات من أجلك.

لست متأكدًا مما هو غير قابل للتطوير في هذا الأمر؛هذا ما تفعله قاعدة البيانات على أي حال.

هنا مثال في بايثون اللامع من http://pubsub-test.appspot.com/:

هل لدى أي شخص واحد لجافا؟شكرًا.

from google.appengine.ext import webapp

from google.appengine.ext import db

class Message(db.Model):
 body = db.TextProperty(required=True)
 sender = db.StringProperty(required=True)
 receiver_id = db.ListProperty(int)

class SlimMessage(db.Model):
 body = db.TextProperty(required=True)
 sender = db.StringProperty(required=True)

class MessageIndex(db.Model):  
 receiver_id = db.ListProperty(int)

class MainHandler(webapp.RequestHandler):

 def get(self):
  receiver_id = int(self.request.get('receiver_id', '1'))
  key_only = self.request.get('key_only').lower() == 'on'
  if receiver_id:
    if key_only:
      keys = db.GqlQuery(
          'SELECT __key__ FROM MessageIndex WHERE receiver_id = :1',
          receiver_id).fetch(10)
      messages.extend(db.get([k.parent() for k in keys]))
    else:
      messages.extend(Message.gql('WHERE receiver_id = :1',
                      receiver_id).fetch(10))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top