我们开发了一个商业应用程序。我们的客户要求定制领域的支持。例如,他们想在“客户”表单中添加一个字段。
存储字段值和有关字段的元数据的已知设计模式是什么?
我现在看到这些选项:
选项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列)。目前,这是最容易实现的。由于我的要求将变得更加复杂,并且要支持的自定义字段的数量将变得更大,因此我可能不得不采用更严格定义的方法。