我想获得有关如何处理Django中1到1..0关系的一些建议。

我有一个产品列表,这些产品的许多属性在很多时候都是空的(最多95%的产品)。我将它们放置在单独的表中,而不是将它们保留在产品表中,因此具有以下内容(年龄和体重为稀疏属性):

products
    id
    colour
    height
    width

product_age
    id
    product_id (FK)
    age

product_weight
    id
    product_id (FK)
    weight


等等

首先,我知道在InnoDB中,null不会占用任何空间,因此我想如果将稀疏属性移到products表中可能不会影响性能。

其次,如果我确实保留了所有这些1到1..0关系,那么如何在models.py中处理它。我目前有:

class Product(models.Model):
    colour = models.CharField(max_length=13)
    height = models.CharField(max_length=13)
    width = models.CharField(max_length=13)

class ProductAge(models.Model):
    product_id = models.ForeignKey(Product)
    age = models.CharField(max_length=13)

class ProductWeight(models.Model):
    product_id = models.ForeignKey(Product)
    weight = models.CharField(max_length=13)


将所有这些都作为不同的对象是不方便的,这意味着我必须记住在编码时哪些属性是单独的对象。

任何帮助,将不胜感激。谢谢

更新

继承在这里起作用,但看起来仍然有些混乱。我需要类似的东西:

class Product(models.Model):
    colour = models.CharField(max_length=13)
    height = models.CharField(max_length=13)
    width = models.CharField(max_length=13)

class ProductWithAge(Product):
    age = models.CharField(max_length=13)

class ProductWithAgeAndWeight(Product):
    weight = models.CharField(max_length=13)


然后,我只能在代码中实际使用ProductWithAgeAndWeight,因为我可以从中访问所有给定字段。数据库将在三个表之间拆分数据。也许我的名字是问题...有什么想法吗?

最佳答案

我认为您不需要在2个额外的表中使用单独的主键。 product_id就足够了:

products
    id
    colour
    height
    width

product_age
    product_id (PK) (FK)
    age

product_weight
    product_id (PK) (FK)
    weight


该模型将是:

class Product(models.Model):
    colour = models.CharField(max_length=13)
    height = models.CharField(max_length=13)
    width = models.CharField(max_length=13)

class ProductAge(models.Model):
    product_id = models.ForeignKey(Product)
    product_id.primary_key=True
    age = models.CharField(max_length=13)

class ProductWeight(models.Model):
    product_id = models.ForeignKey(Product)
    product_id.primary_key=True
    weight = models.CharField(max_length=13)




如果要避免插入/更新产品的复杂性,则应使用一个products表,该表在两行中允许Null。空值确实会占用空间,但是您应该注意的空间并不大。

10-05 21:26