Как хранить пользовательские поля в базе данных - PullRequest
5 голосов
/ 11 ноября 2010

Я пытаюсь найти учебник, который поможет мне понять, как работают пользовательские настраиваемые поля.Как и на сайтах опросов, где они позволяют пользователям создавать настраиваемые поля и сохранять их и, что более важно, сохранять данные, введенные через эти поля.

Я ищу что-то, что описывает, как это делается в базе данных.У меня возникли небольшие проблемы с поиском способа, который бы не занимал вечное извлечение этих данных, как только пользователи захотят извлечь их в файлы excel / cvs.

Ответы [ 3 ]

3 голосов
/ 11 ноября 2010

Шестая Нормальная Форма - формальный способ реализовать это.Выберите 3NF для всех таблиц и 6NF для одной или двух таблиц, в которые нужно добавить столбцы без изменений DDL.Используйте экономно.

EAV - ублюдок 6NF.Это означает, что люди, которые делают это и пишут об этом, не имеют формального понимания 6NF, поэтому часто создают чудовища.

Конечно, вы должны соблюдать хорошие стандарты: используйте типы данных;Декларативная ссылочная целостность (иностранные ключи);и т.д. Не сдавайся, получай что-нибудь.Бегите, как черт, от всех, кто говорит вам, что вы должны отказаться от них.

6NF / EAV очень быстр, нет никаких препятствий для использования возможностей обработки множеств на сервере.Опять же, убегайте от всех, кто говорит вам, что вы должны использовать построчную обработку или курсоры или что вы не можете легко построить столбцы из строк.Отправьте сообщение снова, если у вас есть конкретные проблемы.

Это требует выхода за пределы текущей возможности (управления, DDL) SQL;Чтобы сделать это контролируемым образом и избежать создания неуправляемых монстров, вам нужен небольшой каталог, содержащий метаданные.Если вы сообразительны, вы можете использовать его для генерации SQL, переписанного для запросов, и, таким образом, избавиться от большого количества ручного труда.

Существует много дезинформации, и некоторые люди с "rep" не имеют понятия.Чтобы добиться технического успеха, нам нужна точная информация, а не мифы и распространение страха.Возможно, вас заинтересует недавний пост, в котором я попытался установить секундную прямую .

0 голосов
/ 11 ноября 2010

Мы используем 3 таблицы для каждой таблицы, где нам нужно поддерживать определенные пользователем поля.Например, если вы хотите применить это к своей таблице SURVEY, вы можете создать:

SURVEY_ATTRIBUTE
- SurveyAttributeId
- SurveyAttributeName
- SurveyAttributeType

SURVEY_ATTRIBUTE_CHOICE
- SurveyAttributeChoiceId
- SurveyAttributeChoice
- SurveyAttributeId

SURVEY_ATTRIBUTE_VALUE
- SurveyAttributeValueId
- SurveyId
- SurveyAttributeValue

В таблице SURVEY_ATTRIBUTE хранится одна запись на каждый пользовательский атрибут.В таблице SURVEY_ATTRIBUTE_VALUE хранятся атрибуты, которые фактически назначены опросам.Таким образом, если атрибут не применяется к серверу, ничего не сохраняется.В таблице SURVEY_ATTRIBUTE_CHOICE хранятся все допустимые варианты выбора для атрибутов типа 'LIST'.

Поле SurveyAttributeType в таблице SURVEY_ATTRIBUTE используется для описания типа атрибута.Мы используем только небольшое количество допустимых типов, таких как CHAR, DATE, NUMBER, LIST.В зависимости от этого значения наше приложение знает, что делать со значением, хранящимся в поле SurveyAttributeValue.Конечно, вы можете формализовать это дальше, чтобы расширить диапазон, указать максимальные длины полей и т. Д., Все зависит от уровня свободы, который вы хотите предоставить своему конечному пользователю.Мы стараемся сделать это как можно более простым, поскольку наша целевая аудитория - не администраторы баз данных, а конечные пользователи, они обычно не заботятся о длинах полей и т. Д.

Вы также можете пропустить таблицу SURVEY_ATTRIBUTE_CHOICE и сохранить ее.допустимые значения в строке XML в поле SURVEY_ATTRIBUTE.Это будет зависеть от того, как вы собираетесь реализовать свое приложение.

...