DB / أداء:تخطيط جانغو النموذج الذي نادرا ما يشير إلى الأم أكثر من مرة

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

سؤال

لدي تطبيق هذا عن عرض خيالي مبسطة المدن.

يرجى مراعاة ما يلي جانغو النماذج:

class City(models.Model):
    name = models.CharField(...)
    ...

TYPEGROUP_CHOICES = (
    (1, 'basic'),
    (2, 'extra'),
)

class BldgType(models.Model):
    name = models.CharField(...)
    group = models.IntegerField(choices=TYPEGROUP_CHOICES)

class Building(models.Model):
    created_at = models.DateTimeField(...)
    city = models.ForeignKey(City)
    type = models.ForeignKey(BldgType)
    other_criterion = models.ForeignKey(...)

    class Meta:
        get_latest_by = 'created_at'

تعليل اختيار هذا الإعداد:

(1) كل مدينة لديها بعض المباني من "الأساسية" نوع التي تحدث مرة واحدة في المدينة (أمثلة:قاعة المدينة, محطة, الشرطة, مستشفى, مدرسة) وربما عشرات المباني "إضافية" نوع ، مثل نوادي الرقص.

(2) في بعض وجهات النظر ، جميع المباني (بغض النظر عن المدينة ، الخ.) يتم تصفيتها وفقا لمعايير مختلفة ، على سبيل المثال ، other_criterion.

المشكلة/القلق:

في city_detail عرض علي أن حلقة أكثر من أي المباني "إضافية" النوع ، وهو موافق العادي.

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

وسوف يكون هناك في معظم عشرات من "الأساسية" بناء أنواع ، منها حوالي نصف ستعرض في كل وقت.

أنا أميل نحو كتابة الراحة الطرق في المدينة النموذج ، وأنا مواجهة ثلاثة خيارات:

(A1) من طريق try و مؤشر: .filter(...)[0]

(A2) عبر try و .get(...)

(A3) من طريق try و .filter(...).latest()

ولكن أيا من تلك تبدو أنيقة.أو هو واحد من هذه الخيارات الثلاثة جيدة أن تتحد مع بعض نوع من التخزين المؤقت ، كما في جانغو get_profile() الطريقة على User النموذج ؟ للأسف ليس لدي خبرة مع التخزين المؤقت حتى الآن.

هو المكسرات استخدام ما يلي الخيار ؟

(ب) محددة FKs في المدينة نموذج واحد لكل من أهم أنواع أساسية

السؤال:

وهو الخيار المنطقي أكثر ؟
أو هو المخطط عموما الخاطئ لهذا النوع من السيناريو ؟

خاصة فيما يتعلق DB الأداء ، ماذا تقترح ؟ هل أنا بحاجة إلى نهج مختلف تماما?

يرجى تقديم المشورة!:)

شكرا مقدما!

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

المحلول

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

class City(models.Model):
    name = models.CharField(...)
    city_hall = models.ForeignKey(Building)
    fire_station = models.ForeignKey(Building)
    # ... et cetera

إذا كنت تجد هذا أيضا "فوضوي" في مدينة النموذج ، قد تنظر في وجود وسيط CityBuildings نموذج:

class CityBuildings(models.Model):
    city_hall = models.ForeignKey(Building)
    fire_station = models.ForeignKey(Building)
    # ... et cetera

class City(models.Model):
    name = models.CharField(...)
    buildings = models.OneToOneField(CityBuildings)

ثم يمكنك الرجوع إلى المباني ، على سبيل المثال ، city.buildings.fire_station

هذه مجرد اقتراحات...أنا لست متأكدا مما إذا كان أي من "الصحيح"

نصائح أخرى

لمن يهمه الأمر:سخيفة لي اكتشفت وجود التحفيظ التقنية ، لذا سوف تستخدم شكلا من أن تطبيق (A2) ، ملفوفة في العديد من أساليب الراحة على المدينة النموذج كما يجب "الأساسية" أنواع المباني.

هذا هو على الأقل إلى حد ما أقل فوضوي من وجود FKs في اتجاهين ويتيح قانون يكون أكثر وضوحا حول الفصل بين المصالح (النمذجة على جانب واحد ، الأداء من جهة أخرى).

على السريع, أنا جعلت اثنين من المشاريع للنظر في التعلم وربما الإقراض الأشياء أو تطبيق مباشرة:

  1. جانغو-memoize
  2. github.com/husio/django-easycache/

حتى شخص ما سوف تجد هذه مفيدة أيضا.

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