کلاسهای زیر را در نظر بگیرید. این مدل طراحی مشکلات زیادی به وجوده میاره. با آپدیت شدن کلاس اول مجبور هستیم کلاس دوم و سوم رو هم آپدیت کنیم که با فراموش این نکته توی قسمت های مختلف کد باگهای زیادی ایجاد میشه. و همین آپدیت های اضافی کدهای اضافی در نتیجه باگهای بیشتر و سرعت کمتر رو به ارمغان میاره
depenancy زیادی بین کلاسها میبینید. در صورت آپدیت یک Service باید دو کلاس دیگر هم آپدیت شود و این موضوعی نیست که اتوماتیک انجام شود و ایراداتی در نرم افزار ایجاد میکند:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
class Service(models.Model, Template): name = models.CharField(...) name_fixed = models.CharField(...) ... class Link(models.Model, Template): provider = models.ForeignKey( 'Service'...) provider_name = models.CharField(...) consumer = models.ForeignKey( 'Service',...) consumer_name = models.CharField(...) . . . class Chain(models.Model): pc = models.CharField(...) provider_name = models.CharField(...) consumer_name = models.CharField(...) . . . |
برای حل این موضوع باید کد را Normalize کنیم. یعنی تکرار به حداقل برسد و بجای تکرار اطلاعات موارد تکراری با کلید خارجی تبدیل شود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
class Service(models.Model, Template): name = models.CharField(...) name_fixed = models.CharField(...) ... class Link(models.Model, Template): provider = models.ForeignKey( 'Service'...) consumer = models.ForeignKey( 'Service',...) ... @property def provider_name(self): return self.provider.name @property def consumer_name(self): return self.consumer.name . . . class Chain(models.Model): pc = models.CharField(...) link = models.ForeignKey(Link, ...) ... @property def provider_name(self): return self.link.provider.name @property def consumer_name(self): return self.link.consumer.name |
حالا با آپدیت هر سرویس دو کلاس دیگر به صورت اتوماتیک آپدیت هستند.
گاهی Denormalization به درد میخورد. وقتی میخایم از یک جدول گزارشگیری داشته باشیم و نیاز به Join نباشد تکرار اطلاعات باعث افزایش بهره وری query می شود و …