2011-07-21 41 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