2010-10-09 78 views
1

我有一種系統,用於在某些類別在多對一字段中訂購django模型。非規範化要求?

從部件構成的物品例如採取以下類別:

  • 1:(地點)
  • 2:(材料)

以下部分:

  • Wall(FK = 1)
  • 屋頂(FK = 1)
  • 屋頂(FK = 1)
  • 磚(FK = 2)
  • 瓷磚(FK = 2)
  • 伍德(FK = 2)

要撰寫這些項目: Wall.Brick,Roof.Wood,Wall.Wood

class Category(models.Model): 
    ordering = models.IntegerField() 
    desc = models.CharField() 

class Part: 
    name = models.CharField() 
    category = models.ForeignKey(Category) 
    class Meta: 
     unique_together = ('name', 'category') 
     ordering = ['category','name'] 

class Item: 
    parts = ManyToManyField(Part) 
    def __unicode__(self): 
     return ".".join([p.name for p in self.parts.all()]) 

現在的問題:如何訂購的物品?我寧願讓他們按照組成名字順序升序,但不知道如何。

做事情的一種方式可能是額外的名稱字段,它在save()方法上得到更新。這將意味着反規範化模型...

回答

1

如果我理解正確,排序鍵不存在於數據庫中,所以數據庫無法排序(或至少在平凡,如使用Django的ORM)。

在這些條件下,是 - 非規範化。

這並不丟人。如上所述,歸一化的數據集是爲sissies ...

+0

那麼,denormalizing讓我感覺像一個sissie。我想這是有道理的。 需要在save()時更新name_denormed字段,不僅爲Item而且還有Part以及類別來保護完整性。 – 2010-10-11 13:24:37

+0

是的。從清晰的角度來看,它有點吸引人,但我會在這裏找到它...... denorm是生活中的事實;) – Almad 2010-10-11 15:14:30