2011-09-16 15 views
0

私は個人プロファイルを開く人を提供するWebサイトのデータベース構造を設計しようとしています。 私が選んだデザインが十分であるかどうかを調べようとしています。問題があると思われる理由は、多くのテーブル間に多くの関係を使用することです。そうすれば、人のページが読み込まれているときに、背後に多くのジョインがあり、それが確実にボトルネックを作ります。デザインが適切かどうか、また再考する必要があるかどうかを理解するのを手伝っていただければ幸いです。Djangoでデータベース構造を設計する

だから私は、次のようなデザインが出ている:各ページのために少なくとも5テーブルの結合があるロードされていること

class Person(models.Model): 

    GENDER_CHOICES = (
        ('M', 'Male'), 
        ('F', 'Female'), 
    ) 

    name = models.CharField(max_length=200) 
    # Each person can have one profession 
    profession = models.ForeignKey(Profession) 
    email = models.CharField(max_length=100, blank=True) 
    website = models.CharField(max_length=200, blank=True) 
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)) 
    birth_date = models.DateField(blank=True, null=True)  

class Profession(models.Model):  
    type = models.CharField(max_length=20, blank=False, choices = ("Teacher","Pilot","Politician")) 

#Each person can have several geolocations (represent the person's home/office/other address) 
class Geolocation(models.Model):  
    latitude = models.FloatField() 
    longitude = models.FloatField() 
    address = models.TextField() 
    related_person = models.ForeignKey(Person, blank=False, null=False) 

#Each person can have several medias (you tube movies) 
class Media(models.Model): 
    youtube_id = models.CharField(max_length=100) 
    related_person = models.ForeignKey(Person, blank=False, null=False) 

#Each person can have several websites 
class Websites(models.Model): 
    website_url = models.CharField(max_length=200, blank=False) 
    website_name = models.CharField(max_length=200) 
    related_person = models.ForeignKey(Person, blank=False, null=False) 
    #See below... 
    related_link_farm = models.ForeignKey(LinkFarms, blank=True, null=True) 

#Each website that refers to a person must be also refered to a link farm 
class LinkFarms(models.Model): 
    farm_name = models.CharField(max_length=200, blank=False) 

は注意してください。

おかげで、

メイア

答えて

0

それはデータを正規化しても大丈夫です。それはリレーショナルデータベースのためのものです!あなたのデザインは私にはよく見えます。問題が発生した場合は、常にページレンダリングをキャッシュできます。

0

たぶん、あなたはこのように職業のテーブルを削除することができます:

polititans = Person.objects.filter(profession=Person.POLITITAN_ID) 

class Person(models.Model): 
    ... 

    TEACHER_ID = 'te' 
    PILOT_ID = 'pi' 
    POLITITAN_ID = 'po' 
    PROFESSION_CHOICES = (
     (TEACHER_ID, 'Teacher'), 
     (PILOT_ID, 'Pilot'), 
     (POLITITAN_ID, 'Polititian') 
    ) 
    ... 
    profession = db.CharField(max_length=2, choices=PROFESSION_CHOICES) 

は、その後、あなたがこのようなすべてのpolititianを照会することができます

関連する問題