我想获得有关如何处理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。空值确实会占用空间,但是您应该注意的空间并不大。