实现为具有不同类型数据字段的定制产品保存数据的应用程序的最佳方法是什么?

What is the best way to implement an application that saves data for customized products with different kinds of data fields?

假设我们有一个包含两个 tables ProductProductField 的数据库。 Table ProductField 包含与 Product table 中每个产品相关的几个字段。因此,对于一种产品,它的 ID 在 ProductField 中重复了几次。这是一个很好的模式,可以为每个产品保存多个不同的字段。

但是这个幼稚的解决方案有一个问题。例如在上图中,您可以看到产品字段有不同的类型,名称为字符串,价格字段为数值。因此,我们必须在应用程序的某处保存每个字段的类型。我认为将这种类型保存在另一个 table 中是个好主意,如下所示:

这解决了未知类型的问题。但是仍然存在类型转换问题。因为我们还需要将第一个 table 字段值中的所有值都保存起来,这是一个字符串列。所以我们必须在我们的应用程序中将值转换为所需的类型。这是我们需要的代码:

        // string fieldType retrieved from database
        // string fieldValue retrieved from database
        if (fieldType == "string")
        {
            // do something with fieldValue
        }
        else if (fieldType == "int")
        {
            // do something with int.Parse(fieldValue)
        }
        .
        .

第三种解决方案是对每个字段类型使用一个 table。下图说明了我心中的解决方案。

如您所见,此解决方案的一个缺点是您无法直接创建新的字段类型。如果要添加新的字段类型,您必须在 运行 时间内创建新的 table 并更改数据库架构。 但此解决方案的一个优点是您无需将字符串值转换为 int 或 double 或保存值的实际格式。 你觉得第三种方案怎么样?有道理吗?

假设您确实确实需要一个table来满足具有不同特征的不同产品类型,一个简单的方法是拥有3个tables:

  • header table 包含所有产品(产品id为主键)
  • table 对于每个产品有 N 行的可量化字段(浮点数)(价格、尺寸、百分位数,...)
  • table 对于 un-quantifiable 个字段 (varchar) 每个产品有 N 行(描述、警告、...)

像这样: