كيفية حساب كلا الجانبين من العلاقة بين العديد من العلاقات في محرك تطبيق Google

StackOverflow https://stackoverflow.com/questions/2244850

سؤال

النظر في تطبيق GAE (Python) الذي يتيح للمستخدمين التعليق على الأغاني. العدد المتوقع للمستخدمين هو 1،000،000+. العدد المتوقع من الأغاني هو 5000.

يجب أن يكون التطبيق قادرا على:

  • إعطاء عدد الأغاني التي علق المستخدم على
  • إعطاء عدد المستخدمين الذين علقوا على أغنية

يجب أن تكون الإدارة المضادة المعاملات بحيث تعكس دائما البيانات الأساسية.

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

نموذج بياناتي

class Song(BaseModel):
    name = db.StringProperty()
    # Number of users commenting on the song
    user_count = db.IntegerProperty('user count', default=0, required=True)
    date_added = db.DateTimeProperty('date added', False, True)
    date_updated = db.DateTimeProperty('date updated', True, False)

class User(BaseModel):
    email = db.StringProperty()
    # Number of songs commented on by the user
    song_count = db.IntegerProperty('song count', default=0, required=True)
    date_added = db.DateTimeProperty('date added', False, True)
    date_updated = db.DateTimeProperty('date updated', True, False)

class SongUser(BaseModel):
    # Will be child of User
    song = db.ReferenceProperty(Song, required=True, collection_name='songs')
    comment = db.StringProperty('comment', required=True)
    date_added = db.DateTimeProperty('date added', False, True)
    date_updated = db.DateTimeProperty('date updated', True, False)

شفرة
هذا يعالج عد أغنية المستخدم مععادة ولكن ليس عدد المستخدمين الأغنية.

s = Song(name='Hey Jude')
s.put()

u = User(email='me@example.com')
u.put()

def add_mapping(song_key, song_comment, user_key):
    u = User.get(user_key)

    su = SongUser(parent=u, song=song_key, song_comment=song_comment, user=u);
    u.song_count += 1

    u.put()
    su.put()

# Transactionally add mapping and increase user's song count
db.run_in_transaction(add_mapping, s.key(), 'Awesome', u.key())

# Increase song's user count (non-transactional)
s.user_count += 1
s.put()

السؤال هو: كيف يمكنني إدارة كلا العدادات معا؟

بناء على فهمي سيكون من المستحيل أن يكون المستخدم والأغنية و SongUser جزءا من نفسه مجموعة الكيان. وبعد لا يمكن أن تكون في مجموعة كيان واحدة لأن جميع بياناتي ستكون في مجموعة واحدة ولا يمكن توزيعها من قبل المستخدم.

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

المحلول

لا يجب أن تقلق حقا بشأن التعامل مع عدد المستخدمين من الأغاني التي علقوا عليها داخل الصفقة لأنه يبدو من غير المرجح أن يكون المستخدم قادرا على التعليق على أكثر من أغنية واحدة في وقت واحد، أليس كذلك؟

الآن، هو بالتأكيد الحالة التي يمكن أن تعلق فيها العديد من المستخدمين على نفس الأغنية في وقت واحد، بحيث يتعين عليك أن تقلق بشأن التأكد من عدم وجود البيانات غير صالحة بواسطة حالة السباق.

ومع ذلك، إذا حافظت على عدد عدد المستخدمين الذين علقوا على أغنية داخل كيان الأغنية، وقم بإغلاق الكيان مع المعاملة، فستحصل على خلاف مرتفع للغاية لهذه المهلة التي سيجعلك تطبيقها الكثير من المشاكل.

هذه الإجابة لهذه المشكلة هي شاردت العدادات.

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

فيما يتعلق بقلقاك إزاء التحديثات الخاصة بتحديثات (المعاملات رقم واحد وتحديث المستخدم) لم ينجح كلاهما، وهذا هو دائما احتمال، ولكن بالنظر إلى أن أي تحديث يمكن أن يفشل، ستحتاج إلى التعامل مع الاستثناءات المناسبة لضمان النجاح. هذه نقطة مهمة: غير معاملات غير معاملة غير مضمونة لتحقيق النجاح. قد تحصل على استثناء ArtactionFailedError إذا لم تتمكن المعاملة لا تكتمل لأي سبب من الأسباب.

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

اسأل نفسك أولا: هل هو حقا هذا سيئا إذا كان عدد الأغاني التي علق بها شخص ما على رأسه؟ هل هذا أمر بالغ الأهمية بمثابة تحديث رصيد حساب مصرفي أو إكمال بيع الأسهم؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top