Эффективный способ хранения динамической анкеты? - PullRequest
2 голосов
/ 11 февраля 2011

В отношении этого вопроса я сталкиваюсь почти с тем же сценарием, за исключением того, что в моем случае вопросы, вероятно, являются статическими (время от времени могут изменяться, и я все еще думаю, что это нехорошая идея добавить столбцы для каждого вопроса, но даже я решил добавить, как ответы должны быть указаны / получены из), но ответы бывают разных типов, например, ответ может быть да / нет, элементы списка, свободный текст, элементы списка ИЛИ свободный текст (Другое, укажите, пожалуйста) , элементы списка с множественным выбором и т. д.

Каков эффективный способ реализации этого?

Ответы [ 2 ]

3 голосов
/ 11 февраля 2011

Шимми, я написал статью из четырех частей, посвященную этой проблеме - см. Создание динамического пользовательского интерфейса привода данных . В статье рассказывается, как дать пользователю возможность определить, какие данные о клиентах хранить, поэтому это не точный анализ вашего вопроса, но он довольно близок. А именно, моя статья показывает, как позволить конечному пользователю определить тип данных для хранения, который соответствует желаемому.

Следующая диаграмма ER дает суть модели данных:

Data model

Здесь DynamicAttributesForClients - это таблица, которая указывает, какие пользовательские атрибуты пользователь хочет отследить для своих клиентов. Короче говоря, каждый атрибут имеет значение DataTypeId, которое указывает, является ли он логическим атрибутом, атрибутом Text, числовым атрибутом и т. Д. В вашем случае в этой таблице будут храниться вопросы опроса.

Таблица DynamicValuesForClients содержит значения, сохраненные для конкретного клиента для определенного атрибута. В вашем случае в этой таблице будут храниться ответы на вопросы опроса. Фактическое значение сохраняется в столбце DynamicValue, который имеет тип sql_variant, что позволяет хранить в нем любые типы данных - числовые, битовые, строковые и т. Д.

В моей статье не рассматривается, как обрабатывать вопросы с несколькими вариантами ответов, когда пользователь может выбрать один вариант из предустановленного списка параметров, но расширение модели данных для обеспечения этого довольно просто. Вы должны создать новую таблицу с именем DynamicListOptions со следующими столбцами:

  • DynamicListOptionId - первичный ключ
  • DynamicAttributeId - указывает, с каким атрибутом связаны эти вопросы
  • OptionText - текст опции

Таким образом, если у вас есть атрибут с множественным выбором, вы должны заполнить раскрывающийся список в пользовательском интерфейсе параметрами, возвращаемыми из запроса:

SELECT OptionText
FROM DynamicListOptions
WHERE DynamicAttributeId = ...

Наконец, вы должны сохранить выбранное значение DynamicListOptionId в столбце DynamicValuesForClients.DynamicValue, чтобы записать выбранный ими вариант списка (или использовать NULL, если они не выбирали элемент).

Прочитайте статью. Вы можете скачать полную рабочую демонстрацию, которая включает в себя полную базу данных и ее модель. Кроме того, четыре статьи, из которых состоит серия, подробно исследуют модель данных и показывают, как создать веб-интерфейс (ASP.NET), позволяющий пользователям определять динамические атрибуты, как отображать их для ввода данных и т. Д. .

Счастливого программирования!

2 голосов
/ 11 февраля 2011

Survey ERD

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

У меня есть таблица вопросов, таблица ответов иобзорная таблица.Для каждого нового опроса я составляю сборку опроса (потому что каждый опрос уникален, но вопросы и ответы многократно повторяются).Затем у меня есть таблица респондентов, которая содержит некоторую информацию об респонденте (и она также ссылается на таблицу опроса, забыл, что на диаграмме).У меня также есть таблица ответов, которая связывает респондента и структуру опроса.Это, вероятно, не лучший способ, но он работает для меня, и он работает довольно быстро (в таблице ответов примерно 1 милла +, и он работает как сон).

С этой модельюя получаю многократно используемые вопросы, многократно используемые ответы (многие наши вопросы используют «да» и «нет») и довольно тонкую таблицу ответов.

...