DB / أداء:تخطيط جانغو النموذج الذي نادرا ما يشير إلى الأم أكثر من مرة
-
10-07-2019 - |
سؤال
لدي تطبيق هذا عن عرض خيالي مبسطة المدن.
يرجى مراعاة ما يلي جانغو النماذج:
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 في اتجاهين ويتيح قانون يكون أكثر وضوحا حول الفصل بين المصالح (النمذجة على جانب واحد ، الأداء من جهة أخرى).
على السريع, أنا جعلت اثنين من المشاريع للنظر في التعلم وربما الإقراض الأشياء أو تطبيق مباشرة:
- جانغو-memoize
- github.com/husio/django-easycache/
حتى شخص ما سوف تجد هذه مفيدة أيضا.