Разработка гибкой и эффективной системы вопросов и ответов - PullRequest
13 голосов
/ 12 февраля 2012

Я работал над динамической системой вопросов и ответов, но у меня возникли проблемы с созданием эффективного И гибкого дизайна для этой системы.Я хотел бы знать, есть ли установленный шаблон проектирования или какие-либо рекомендации для проектирования этой системы.

Что я пытаюсь сделать

У меня есть ряд вопросов.После ответа на них отображается другой набор вопросов в зависимости от ответов на предыдущий набор .Это повторяется до тех пор, пока больше не нужно больше вопросов.

Все ответы на вопросы являются логическими, множественными или числовыми.

Важная часть заключается в том, что большинство вопросов показываются только при соблюдении определенного набора критериев, основанных на предыдущих ответах.
Мне нужны критерии для поддержки в основном булевой логики,например, И, Или, Не, Равно, Больше, чем Меньше.

Например, допустим, я уже получил ответы на такие вопросы, как Age, Gender и State.
Один из следующих вопросов - In School?, но он должен отображаться ТОЛЬКО, если: Age < 30 AND Gender=Male AND (State = CA OR State = NY)

Кто-нибудь слышал о подобном шаблоне проектирования?Как бы вы подошли к этому дизайну?

Справочная информация

Я пробовал столбцы базы данных

Сначала у нас было только 3 начальных вопроса, поэтому мы использовали 3 столбца для фильтрации второго набора вопросов.

Однако потребности нашего бизнеса выросли, и нам стали нужны дополнительные начальные вопросы, добавлено больше столбцов и добавлена ​​логика в эти фильтры.

Это быстро стало слишком жестким и громоздким.

Я попробовал интерпретатор логики

Наша вторая попытка сделать систему более гибкой: сохранить логику фильтрации как JavaScript и запуститьинтерпретатор JavaScript для фильтрации результатов.

Это работало довольно хорошо для гибкости, но извлечение тысяч строк из базы данных и интерпретация сценариев были крайне неэффективными и работали слишком плохо для производства.

Я попробовал гибридный

Наконец, мы объединили два подхода и придумали что-то выполнимое.
Сначала мы отфильтровали наш список на основе нескольких жестко закодированных столбцов базы данных, а затем отфильтровали список с помощью интерпретатора JavaScript.

Эта гибридная система все еще имеет много недостатков:

  • Логика в двух разных системах (логика базы данных SQL и интерпретатор JavaScript)
  • Интерпретация JavaScript медленная,и, вероятно, это излишне для простой логической логики, необходимой
  • Система очень сложна в обслуживании, особенно потому, что логика JavaScript всегда должна быть написана разработчиком.

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

Другая информация

Моя база данных - MS SQL Server, серверная часть - .NET C #, а интерпретатор JavaScript - JINT.Реализация пользовательского интерфейса не важна, но это веб-сайт с поддержкой AJAX, который используется для того, чтобы задавать и отвечать на эти вопросы.

Ответы [ 3 ]

3 голосов
/ 12 февраля 2012

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

http://www.javaworld.com/javaworld/javatips/jw-javatip139.html?page=1

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

1 голос
/ 12 февраля 2012

Если я правильно понимаю ваш вопрос, похоже, вы создаете конечный автомат .

Каждое состояние соответствует вопросу, и на основе ответа вы переходите к новому вопросу. Тот же вопрос может возникнуть в нескольких отдельных штатах.

В вашем примере начальным состоянием будет вопрос «Состояние?», И если ответом будет «CA», мы перейдем к следующему состоянию с вопросом «Арендовать или иметь?». Для любого ответа на этот вопрос следующим состоянием будет вопрос "Возраст?" так как нет дополнительных подвопросов для «Государства?» путь.

Для вашей модели БД вам нужны таблица состояний и таблица отношений между состояниями, то есть:

таблица состояний:

  • id (int)
  • вопрос (varchar)
  • тип (set [text, boolean, int])

таблица state_state:

  • fromState (int)
  • toState (INT)
  • answerType (установите [любой, равно, больше, ...])
  • ответ (varchar)

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

Если у вас много состояний с одним и тем же вопросом, вы можете создать таблицу вопросов и связать ее с состоянием.

Если у вас есть несколько «начальных вопросов», вы можете либо иметь один конечный автомат и привязать конечные вопросы к следующему «начальному вопросу», либо у вас может быть несколько конечных автоматов.

0 голосов
/ 12 февраля 2012

У нас было похожее требование для создания пользовательских опросов.У нас есть 3 таблицы, вопрос, ответ и вопрос.таблица ответов позволяет создавать несколько ответов на каждый вопрос, а таблица вопросов позволяет выбирать следующий вопрос на основе конкретного ответа.

CREATE TABLE [dbo].[Question]
(
QuestionID uniqueidentifier,
[Text] varchar(512)
)
CREATE TABLE [dbo].[Response]
(
ResponseID uniqueidentifier,
QuestionID uniqueidentifier,
[Text] varchar(512)
)
CREATE TABLE [dbo].[QuestionRoute]
(
QuestionRouteID uniqueidentifier,
QuestionID uniqueidentifier,
ResponseID uniqueidentifier,
NextQuestionID uniqueidentifier
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...