2011-07-21 42 views
1

這個問題可能非常天真,在這種情況下,我很抱歉。我想了解更多關於數據庫管理的知識,我不確定哪種選擇在這種情況下更可取。我有一個模型可以很容易地分成兩個表格。它包含公司的聯繫信息和個人資料信息。更有效的外鍵關係或大表(思考問題)?

 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

謝謝約翰,我只是因爲他在早些時候提出了答案才與bash一起去。不過,好的口頭禪,我喜歡它。 – Ben