2011-07-21 8 views
1

この質問は非常に素朴なものかもしれません。この場合、私はお詫び申し上げます。私はデータベース管理についてもっと学びたいと思っています。この場合、どの選択肢が望ましいかは不明です。私は簡単に2つのテーブルに分割できるモデルを持っています。会社の連絡先情報とプロフィール情報が含まれています。より効率的な外部キーの関係または大きなテーブル(問題を考えて)?

 class Company(models.Model): 
     name=models.CharField(max_length=100) 
     street_address=models.CharField(max_length=100, blank=True) 
     city=models.CharField(max_length=100, blank=True) 
     state=models.CharField(max_length=100, blank=True) 
     zipcode=models.IntegerField(max_length=5, blank=True) 
     input_level=models.CharField(choices=((0,'Less',),(1,'More')) 
     expense_min=models.IntegerField(blank=True) 
     expense_max=models.IntegerField(blank=True) 
     health_value=models.IntegerField(choices=[(i+1,i+1) for i in range(5)], blank=True) 
     group_size=models.IntegerField(blank=True) 
     comment=models.TextField(max_length=500, blank=True) 
     created=models.DateField(auto_now_add=True) 
     registered=models.BooleanField(default=False) 

かなりの数の列がありますが、これを関連する表に分割する明白な理由はありません。住所関連の情報はおそらく同じままになりますが、プロファイル関連の情報(郵便番号の下)は頻繁に変更されることがあります。私は、ジョインのコストは、多くの行を持つテーブルに更新/挿入するコストを上回ると考えています。

基本的なルールはありますか、それともプロファイルするだけですか?

答えて

2

スキーマの正規化と非正規化に関する正解または間違いはありません。

パフォーマンスは重要な基準ですか?そうであれば、プログラムの複雑さのためにコストが掛かり、非正規化されたテーブルを使います。

テーブルが小さく、パフォーマンスが大きな問題ではない場合は、プログラムの複雑さに心配しないでください。別のテーブルの列を更新することを忘れると、多くの問題が発生します。

また、索引は結合では使用できないこともあります。

+0

素晴らしい答えbash。どうもありがとう。 – Ben

2

基本ルールは「簡単なまま」です!

テーブルを分割する優れた理由を特定していないので、テーブルを分割しないでください。あなたが行った後、あなたがなぜそのような決定をしたのか疑問に思って頭を撫でている次の人の立場から考えてみましょう。 "私の前任者はスマートだったので、正当な理由があるに違いない...まあまあ!"

+0

ジョンさん、ありがとうございました。私は早く答えを発表したばかりなので、バッシュと一緒に行くつもりです。良いマントラ、しかし、私はそれが好きです。 – Ben

関連する問題