Разработка гибкой и эффективной системы поиска и ответа
Я работаю над динамической системой вопросов и ответов, но мне не удается создать эффективный и гибкий дизайн для этой системы. Я хотел бы узнать, существует ли установленная схема проектирования или какие-либо рекомендации для проектирования этой системы.
Что я пытаюсь сделать
У меня есть набор вопросов. После ответа на них отображается еще один набор вопросов, в зависимости от ответов на предыдущий набор. Это повторяется, пока больше вопросов не потребуется.
Ответы на вопросы являются логическими, множественными или числовыми.
Важная часть заключается в том, что большинство вопросов отображаются только при выполнении определенного набора критериев на основе предыдущих ответов.
Мне нужны критерии для поддержки в основном логической логики, такой как "И", "Или", "Равно", "Больше и меньше".
Например, скажем, я уже получил ответы на такие вопросы, как 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, который задает и отвечает на эти вопросы.
Ответы
Ответ 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
)