2016-04-13 7 views
2

私はさまざまなアクティビティを追加できるDjangoアプリケーションを作成しています。一部のアクティビティには、それ自身にのみ適用可能なフィールドがあります。Djangoモデルデザイン - 1つまたは複数のテーブル

オプション1(複数のテーブル)はいくつかの点ではよりクリーンであるようですが、私はすべてのアクティビティをリストビューに表示したいので、オプション2をより魅力的にします。また、特定のアクティビティを追加するモデルフォームも用意されています。

他のオプションより明らかに優れているオプションの1つですか、それとも優先事項ですか?

オプション1

class BaseActivity(models.Model):  
    user = models.ForeignKey(User) 
    date = models.DateField() 
    ave_heart_rate = models.FloatField(validators=[MinValueValidator(0)]) 

    class Meta: 
     abstract = True 

class TennisActivity(BaseActivity): 
    pass # no extra fields 

class GolfActivity(BaseActivity):  
    score = models.IntegerField() #only applicable to golf 

class JogActivity(BaseActivity):  
    distance = models.FloatField() #only applicable to jogging 

またはオプション2

class BaseActivity(models.Model):  
    activity_choices = (('Tennis', 'tennis'), 
         ('Golf','golf'), 
         ('Jog','jog')) 

    user = models.ForeignKey(User) 
    activity_type = models.Charfield(choices=activity_choices) 
    date = models.DateField() 
    ave_heart_rate = models.FloatField(validators=[MinValueValidator(0)]) 
    score = models.IntegerField(blank=True, null=True) 
    distance = models.FloatField(blank=True, null=True) 

答えて

1

私はそれはあなたがそれを可能にする方法を拡張可能に依存しますね。あなたがそれを最初のやり方でするならば、あなたはDB全体を更新することを心配することなく新しい活動を加えることができます。それは入力と処理の背後にあるロジックをやや難しくしますが、それほど難しくありません。オプション2は、拡張が難しいことを意味しますが、それを心配していなければ、全体的に扱う方がはるかに簡単です。

私は個人的にオプション1を選択します。

関連する問題