如何正确关联数据?

时间:2015-02-01 07:57:24

标签: sql django postgresql django-models entity-relationship

我有这个数据库,我存储来自不同零售商的衣服:

  • 所以每种产品都有不同的颜色
  • 每种产品也有不同的尺寸
  • 每种尺寸也有不同的颜色
  • 现在,对于每种产品以及每种不同尺寸和颜色,可能会有不同的价格。

我正在使用Django,我想问这个数据库关系如何解决的问题。

我会有这样的事吗?

class Product(models.Model):
    name = model.CharField()

class Size(models.Model):
    size_of_product = model.CharField()
    product = model.ForeignKey(Product)

class Color(models.Model):
    color_of_product = model.CharField()
    product = model.ForeignKey(Product)
    size = model.ManyToManyField(Size,though="Price")

class price(model.Model):
    size = model.ForeignKey(Size)
    color = model.ForeignKey(Color)
    date =model.Date()

有人可以建议我找一个更好的解决方案,因为很明显我对数据库的实践不多吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我建议以下内容与您的初始设计保持一致:

class Product(models.Model):
    name = models.CharField()

class Size(models.Model):
    size_of_product = models.CharField()

class Color(models.Model):
    color_of_product = models.CharField()

class ProductPrice(model.Model):
    size = models.ForeignKey(Size)
    color = models.ForeignKey(Color)
    product = modelss.ForeignKey(Product)
    price = models.DecimalField(...)

通过它,您将拥有产品列表,尺寸列表和颜色列表。每当您想要为产品添加变体时,您只需要一个新的ProductPrice实例,其价格为所有三个(产品,尺寸,颜色)实例的组合。

然而,作为一般性评论,大多数电子商店不会像这样工作,因为产品具有比颜色或尺寸更多的特征(例如制造商或材料)。

因此,更通用的解决方案是拥有一个Category模型来定义不同类别的东西(如鞋子,夹克,裤子)。每个Category都有Characteristic个{(例如颜色或材质),每个Characteristic都有一些Value s(例如蓝色,棕色或皮革,棉花等)。最后,您的Product将是具有价格的特定商品,属于特定的Category,并且对于该Value的{​​{1}}具有特定Characteristic个{ {1}}。

class Characteristic(models.Model):
    name = modes.CharField()


class Category(models.Model):
    name = modes.CharField()
    # Each Category can have many characteristics and each
    # characteristic may be related to many categories (e.g
    # both shoes and jackets have color
    characteristics = models.ManyToManyField(Characteristic)


class Value(models.Model):
    value = models.CharField()
    # each value belongs to a specific characteristic
    characteristic = models.ForeignKey(Characteristic)


class Product(models.Model):
     category = models.ForeignKey(Category)
     # A product will have a number of values (e.g brown, leather)
     values = models.ManyToManyField(Value)
     prices = models.DecimalField()

因此,使用上述设计,我们可以为每个产品提供尽可能多的特性。

答案 1 :(得分:0)

好的,所以你要为服装造型。 (双关语绝对有意!)好吧,让我们看看我们能做些什么。

  • 每种产品都有不同的颜色

精细。实体product具有属性color。让我们继续。

  • 每种产品也有不同的尺寸

再次罚款。实体product具有属性size。到目前为止一切都很好。

  • 每种尺寸也有不同的颜色

庵。坚持,稍等。虽然产品可能具有尺寸和颜色,但尺寸不能具有颜色,颜色也不能具有尺寸。作为属性,这些属性与product相关,而不是彼此相关。你的建模在这一点上破裂了。

我认为你的意思是所有颜色都没有。这是不同的。在这种情况下,颜色与产品没有直接关系,而是产品/尺寸组合。

您已将此正确识别为多对多关系。但它是在颜色和中间产品/尺寸组合之间,而不是直接与产品。