Разрабатываем коммерческое приложение.Наши клиенты просят о поддержке пользовательских полей.Например, они хотят добавить поле в форму Заказчика.
Каковы известные шаблоны проектирования для хранения значений полей и метаданных о полях?
Я вижу эти параметрына данный момент:
Опция 1 : Добавить столбцы Field1, Field2, Field3, Field4 типа varchar в мою таблицу Customer.
Опция 2 :Добавьте один столбец типа XML в таблицу customer и сохраните значения настраиваемых полей в формате xml.
Option 3 : добавьте таблицу CustomerCustomFieldValue со столбцом типа varchar и сохраните значения вэтот столбец.Эта таблица также будет иметь 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 со следующими столбцами: CustomFieldID, FieldName, FieldValueTypeID.
Option4 : добавьте таблицу 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).Это было проще всего реализовать на данный момент.Вероятно, мне придется отказаться от более строго определенного подхода, поскольку мои требования будут усложняться, а количество поддерживаемых настраиваемых полей будет увеличиваться.