我们开发商业应用程序。我们的客户要求自定义字段支持。例如,他们想向客户表单添加一个字段。
存储字段值和有关字段的元数据的已知设计模式是什么?
我现在看到这些选项:
选项 1:将 varchar 类型的 Field1、Field2、Field3、Field4 列添加到我的 Customer 表中。
选项 2:在客户表中添加一个 XML 类型的列,并将自定义字段的值存储在 xml 中。
选项 3:添加一个带有 varchar 类型列的 CustomerCustomFieldValue 表,并将值存储在该列中。该表还将有一个 CustomerID,一个 CustomFieldID。
CustomerID, CustomFieldID, Value
10001, 1001, '02/12/2009 8:00 AM'
10001, 1002, '18.26'
10002, 1001, '01/12/2009 8:00 AM'
10002, 1002, '50.26'
CustomFieldID 将是另一个名为 CustomField 的表中的 ID,其中包含以下列:CustomFieldID、FieldName、FieldValueTypeID。
选项 4:添加一个 CustomerCustomFieldValue 表,其中包含每个可能的值类型的列,并将值存储在右列中。与 #3 类似,但字段值使用强类型列存储。
CustomerID, CustomFieldID, DateValue, StringValue, NumericValue
10001, 1001, 02/12/2009 8:00 AM, null, null
10001, 1002, null, null, 18.26
10002, 1001, 01/12/2009 8:00 AM, null, null
10002, 1002, null, null, 50.26
选项 5:选项 3 和 4 使用特定于单个概念(客户)的表。我们的客户也要求其他形式的自定义字段。我们是否应该有一个系统范围的自定义字段存储系统?因此,与其拥有多个表,例如 CustomerCustomFieldValue、EmployeeCustomFieldValue、InvoiceCustomFieldValue,我们将拥有一个名为 CustomFieldValue 的表?虽然它对我来说似乎更优雅,但这不会导致性能瓶颈吗?
您是否使用过这些方法中的任何一种?你成功了吗?你会选择什么方法?你知道我应该考虑的其他方法吗?
此外,我的客户希望自定义字段能够引用其他表中的数据。例如,客户可能希望向客户添加“最喜欢的付款方式”字段。付款方式在系统的其他地方定义。这带来了图片中“外键”的主题。我是否应该尝试创建约束以确保存储在自定义字段表中的值是有效值?
谢谢
=======================
编辑 07-27-2009:
谢谢您的回答。看起来方法列表现在非常全面。我选择了选项 2(单个 XML 列)。这是目前最容易实现的。由于我的要求将变得更加复杂,并且要支持的自定义字段的数量将变得更大,因此我可能不得不采用更严格定义的方法。