Мы используем SQL Server 2008, и одним из требований является наличие расширяемых пользовательских атрибутов для сущностей, определенных для системы. Например, у нас может быть объект «Доктор», мы хотим, чтобы администраторы системы могли определять дополнительные атрибуты, которые обычно отсутствуют в системе. Эти атрибуты, скорее всего, понадобятся как критерии запроса, связывающие родительские или объединяющие таблицы.
Будут таблицы, которые определяют атрибуты (имя, описание, тип) и т. Д., Но мой вопрос касается хранения фактических значений данных.
Я не администратор баз данных (просто программист, притворяющийся таковым), но моей первой мыслью было сохранить их в одном общем столбце как
nvarchar(450)
Это охватывало бы большинство основных типов и по-прежнему позволяло бы индексировать, но я думал, что столкнусь с множеством проблем с типами конверсий (преобразование в даты, числа и т. Д.), А также с необычными проблемами с запросами, поскольку все это nvarchar .
Итак, мое последнее решение - создать столбец для каждого типа данных, который мы будем поддерживать:
ColNVarCharData
nvarchar(450)
ColBitData
bit
ColIntData
int
.. И т. Д.
Когда пользователь определял расширяемый атрибут, он выбирал тип данных, а затем мы сохраняли значение атрибута в этом столбце для этого типа. Например, если они выбрали int, значение данных будет сохранено в ColIntData, а два других столбца будут нулевыми в этом примере.
Я думаю, что это решает проблемы преобразования, а не сохраняет каждый атрибут как универсальный тип. Кроме того, я мог бы добавлять индексы по мере необходимости для каждого типа в зависимости от используемого запроса.
Я склоняюсь к использованию этого, но удивляюсь, есть ли у кого-нибудь еще какие-либо предложения. Я кратко рассмотрел тип данных XML, но «схема» могла меняться довольно часто, поэтому я подумал, что это лучше подходит.