Подтвердить что ты не робот

Разработка гибкой и эффективной системы поиска и ответа

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

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

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

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

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

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

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


Фоновая информация

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

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

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

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

Я попробовал Logic Interpreter

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

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

Я попробовал Hybrid

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

В этой гибридной системе все еще есть много недостатков:

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

Мне бы очень хотелось услышать предложения по улучшению этого дизайна.

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Для модели db вам нужна таблица состояний и таблица отношений между состояниями, например:

:

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

table state_state:

  • fromState (int)
  • toState (целое)
  • answerType (установить [any, equals, больше,...])
  • ответ (varchar)

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

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

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

Ответ 3

У нас было аналогичное требование для создания пользовательских опросов. У нас есть 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
)