【问题标题】:How to relate data correctly?如何正确关联数据?
【发布时间】:2015-03-31 09:24:36
【问题描述】:

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

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

我正在为此使用 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()

谁能建议我更好的解决方案,因为显然我还没有太多的数据库实践?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    我建议以下内容与您的初始设计相近:

    类产品(模型。模型): 名称 = 模型.CharField() 类大小(模型。模型): size_of_product = models.CharField() 类颜色(模型。模型): color_of_product = models.CharField() 类产品价格(模型。模型): 大小 = 模型。外键(大小) 颜色 = 模型。外键(颜色) product = modelss.ForeignKey(Product) 价格 = 模型.DecimalField(...)

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

    但是,一般来说,大多数电子商店都不是这样工作的,因为产品的特性比颜色或尺寸(例如制造商或材料)更多。

    因此,更通用的解决方案是使用 Category 模型来定义不同类别的事物(例如鞋子、夹克、裤子)。每个Category 有多个Characteristics(例如颜色或材料),每个Characteristic 有多个可能的Values(例如蓝色、棕色或皮革、棉等)。最后,您的Product 将是一个具有价格的特定项目,将属于特定的Category,并且对于该Category 的每个Characteristics 都有特定的Values。

    类特征(models.Model): 名称 = 模式.CharField() 类类别(模型。模型): 名称 = 模式.CharField() # 每个类别可以有许多特征,每个 # 特征可能与许多类别有关(例如 # 鞋子和夹克都有颜色 特征 = 模型.ManyToManyField(Characteristic) 类值(模型。模型): 值 = 模型.CharField() # 每个值都属于一个特定的特征 特征=模型.ForeignKey(特征) 类产品(模型。模型): 类别=模型.ForeignKey(类别) # 一个产品会有多个值(例如棕色、皮革) 值 = 模型.ManyToManyField(值) 价格 = 模型.DecimalField()

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

    【讨论】:

    • 谢谢!很不错!唯一的问题是我可以有不同价格的尺寸和颜色组合,我不知道我是否可以在这里实现。所以像 color:blue size:Medium 会有一个价格,而 color:red with size:medium 可以有另一个尺寸。
    • 您绝对可以使用 both 方法实现此目的。我认为很明显,使用第一种方法,您只需为产品 X 添加一个ProductPrice,其值为 (X, blue, medium, price1) 和 (X, red, medium, price2)。关于第二种方法,您只需添加两个具有不同价格和不同值的Products(一个带有红色和中等,另一个带有蓝色和中等)
    【解决方案2】:

    好的,你正在做服装造型。 (双关语绝对是故意的!)好吧,让我们看看我们能做些什么。

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

    很好。实体product 有一个属性color。让我们继续吧。

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

    又好了。实体product 有一个属性size。到目前为止一切顺利。

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

    嗯。坚持,稍等。虽然产品可能有尺寸和颜色,但尺寸不能有颜色,颜色也不能有尺寸。作为属性,它们与product 相关,而不是彼此相关。您的建模此时会崩溃。

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-21
      • 2021-11-12
      相关资源
      最近更新 更多