Мы разрабатываем коммерческое приложение. Наши клиенты просят поддержку пользовательских полей. Например, они хотят добавить поле в форму клиента.
Каковы известные шаблоны проектирования для хранения значений полей и метаданных о полях?
Я вижу следующие параметры:
Вариант 1: добавьте поля Field1, Field2, Field3, Field4 типа varchar в таблицу Customer.
Вариант 2. Добавьте один столбец типа XML в таблицу клиентов и сохраните значения настраиваемых полей в xml.
Вариант 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.
Вариант 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? Хотя для меня это кажется более изящным, не может ли это вызвать узкое место в производительности?
Вы использовали какой-либо из этих подходов? Вы были успешны? Какой подход вы бы выбрали? Знаете ли вы какой-либо другой подход, который я должен рассмотреть?
Кроме того, мои клиенты хотят, чтобы пользовательское поле могло ссылаться на данные в других таблицах. Например, клиент может захотеть добавить к "Клиенту" поле "Любимый способ оплаты". Способы оплаты определяются в других местах системы. Это приводит к теме "внешних ключей" на картинке. Должен ли я попытаться создать ограничения, чтобы гарантировать, что значения, хранящиеся в пользовательских таблицах полей, являются допустимыми значениями?
Спасибо
======================
EDIT 07-27-2009:
Спасибо за ваши ответы. Похоже, что список подходов теперь довольно всеобъемлющий. Я выбрал вариант 2 (один столбец XML). На данный момент это было проще всего реализовать. Мне, вероятно, придется преувеличивать более строго определенный подход, так как мои требования будут более сложными, а количество поддерживаемых настраиваемых полей будет больше.