首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设计一个灵活高效的问答系统。

设计一个灵活高效的问答系统。
EN

Stack Overflow用户
提问于 2012-02-12 08:43:05
回答 3查看 2K关注 0票数 13

我一直在开发一个动态问答系统,但是我在为这个系统创建一个高效灵活的设计时遇到了困难。我想知道是否有一个既定的设计模式或任何设计这个系统的建议。

我想做的是

我有一系列问题。回答完这些问题后,将显示另一组问题,取决于上一组的答案。这是重复的,直到不需要更多的问题。

问题的答案都是布尔型的,多选的,或者数字的.

的重要部分是,大多数问题只有在满足了一组特定的标准时才会显示出来,这是基于以前的答案。

我需要条件主要支持布尔逻辑,例如和,或者,不等于,大于和小于。

例如,假设我已经收到了AgeGenderState等问题的答案。

接下来的问题之一是In School?,但是它只应该显示在:Age < 30 AND Gender=Male AND (State = CA OR State = NY)

有人听说过类似的设计模式吗?你会如何处理这个设计?

背景资料

我尝试过数据库列

一开始,我们只有3个初始问题,所以我们只使用3列来过滤第二组问题。

然而,我们的业务需求增长了,我们开始需要更多的初始问题,增加了更多的列,并在这些过滤器中添加了更多的逻辑。

这很快就变得过于僵化和繁琐。

我试过逻辑解释器

我们第二次尝试使系统更加灵活:将过滤逻辑存储为JavaScript,并运行JavaScript解释器来过滤结果。

这对于灵活性来说非常有效,但是从数据库中检索数千行并解释脚本是非常低效的,对于生产来说执行得太差了。

我试了个杂交的

最后,我们把这两种方法结合起来,想出了一些可行的办法。

我们首先根据几个硬编码的数据库列对列表进行筛选,并使用JavaScript解释器进一步过滤列表。

这种混合系统仍然有许多缺点:

  • 逻辑位于两个不同的系统中(SQL数据库逻辑和JavaScript解释器)。
  • 解释JavaScript很慢,对于所需的简单布尔逻辑来说可能是过分的。
  • 系统很难维护,特别是因为JavaScript逻辑必须始终由开发人员编写。

我真的很想听听如何改进这个设计的建议。

其他信息

我的数据库是interpreter,后端是.NET C#,JavaScript解释器是JINT。UI实现并不重要,但它是一个启用AJAX的网站,用于询问和回答这些问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-12 10:27:54

在过去的医疗系统中,我们不得不做一些类似的事情,由于它的复杂性,我们不得不重用支持多分类决策树的规则引擎。我记得,我遇到了一个不错的简单设计,并设法挖掘出这个链接。

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

该设计与数据存储松耦合,因此很容易与现有的解决方案设计相适应。

票数 3
EN

Stack Overflow用户

发布于 2012-02-12 09:50:55

如果我正确理解你的问题,听起来你在构建一个有限状态机

每一种状态对应于一个问题,根据答案,你将进入一个新的问题。同样的问题可能会在几个不同的州出现。

在您的示例中,开始状态将是问题" state ?",如果它的答案是"CA“,那么我们将使用"Rent还是Own?”问题转移到下一个状态。对于这个问题的任何答案,下一个州将是“年龄”问题?既然“国家”(State?)->“出租”或“自有”没有进一步的子问题?路径。

对于db模型,需要状态表和状态之间的关系表,即:

表中规定:

  • id (int)
  • 问题(varchar)
  • 类型(设置文本、布尔值、int)

表state_state:

  • fromState (int)
  • toState(int)
  • answerType (setany,等于,更大,.)
  • 回答(varchar)

在您的代码中,您只需要知道当前状态,询问问题,查询state_state,并将结果与所给出的答案进行比较,以了解下一个状态的id是什么,从而知道下一个问题。

如果您有很多相同问题的状态,您可以创建一个问题表并将其与状态关联。

如果您有几个‘开始问题’,您可以有一个状态机,并将结束问题与下一个‘开始问题’,或者您可以有几个状态机。

票数 1
EN

Stack Overflow用户

发布于 2012-02-12 11:43:26

我们有一个类似的要求来创建定制调查。我们有三个表格,问题,答复和提问路线。response表允许您为每个问题创建多个答案,问题路由表允许您根据特定的回答选择下一个问题。

代码语言:javascript
复制
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
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9247519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档