我们开发了一个商业应用程序。我们的客户要求定制领域的支持。例如,他们希望向 Customer 表单添加一个字段。
存储字段值和有关字段的元数据的已知设计模式是什么?
我现在看到了这些选择:
选项1 : 将 varchar 类型的 Field1、 Field2、 Field3、 Field4列添加到 Customer 表中。
选项2 : 在 customer 表中添加一个 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使用特定于单个概念(Customer)的表。我们的客户要求在其他形式的定制领域以及。相反,我们是否应该有一个全系统的自定义字段存储系统?因此,我们不需要使用多个表,如 CustomerCustomFieldValue、 EmployeeCustomFieldValue、 InvoiceCustomFieldValue,而是使用一个名为 CustomFieldValue 的表?虽然在我看来它更优雅,但是这不会导致性能瓶颈吗?
你使用过这些方法中的任何一种吗? 你成功了吗? 你会选择什么方法? 你知道我还应该考虑什么其他方法吗?
另外,我的客户希望自定义字段能够引用其他表中的数据。例如,客户端可能希望向客户端添加“收藏夹支付方法”字段。支付方式在系统的其他地方定义。这就引出了“外键”这个话题。是否应尝试创建约束以确保存储在自定义字段表中的值是有效值?