我一直在开发一个动态问答系统,但是我在为这个系统创建一个高效灵活的设计时遇到了困难。我想知道是否有一个既定的设计模式或任何设计这个系统的建议。
我想做的是
我有一系列问题。回答完这些问题后,将显示另一组问题,取决于上一组的答案。这是重复的,直到不需要更多的问题。
问题的答案都是布尔型的,多选的,或者数字的.
的重要部分是,大多数问题只有在满足了一组特定的标准时才会显示出来,这是基于以前的答案。
我需要条件主要支持布尔逻辑,例如和,或者,不等于,大于和小于。
例如,假设我已经收到了Age、Gender和State等问题的答案。
接下来的问题之一是In School?,但是它只应该显示在:Age < 30 AND Gender=Male AND (State = CA OR State = NY)
有人听说过类似的设计模式吗?你会如何处理这个设计?
背景资料
我尝试过数据库列
一开始,我们只有3个初始问题,所以我们只使用3列来过滤第二组问题。
然而,我们的业务需求增长了,我们开始需要更多的初始问题,增加了更多的列,并在这些过滤器中添加了更多的逻辑。
这很快就变得过于僵化和繁琐。
我试过逻辑解释器
我们第二次尝试使系统更加灵活:将过滤逻辑存储为JavaScript,并运行JavaScript解释器来过滤结果。
这对于灵活性来说非常有效,但是从数据库中检索数千行并解释脚本是非常低效的,对于生产来说执行得太差了。
我试了个杂交的
最后,我们把这两种方法结合起来,想出了一些可行的办法。
我们首先根据几个硬编码的数据库列对列表进行筛选,并使用JavaScript解释器进一步过滤列表。
这种混合系统仍然有许多缺点:
我真的很想听听如何改进这个设计的建议。
其他信息
我的数据库是interpreter,后端是.NET C#,JavaScript解释器是JINT。UI实现并不重要,但它是一个启用AJAX的网站,用于询问和回答这些问题。
发布于 2012-02-12 10:27:54
在过去的医疗系统中,我们不得不做一些类似的事情,由于它的复杂性,我们不得不重用支持多分类决策树的规则引擎。我记得,我遇到了一个不错的简单设计,并设法挖掘出这个链接。
http://www.javaworld.com/javaworld/javatips/jw-javatip139.html?page=1
该设计与数据存储松耦合,因此很容易与现有的解决方案设计相适应。
发布于 2012-02-12 09:50:55
如果我正确理解你的问题,听起来你在构建一个有限状态机。
每一种状态对应于一个问题,根据答案,你将进入一个新的问题。同样的问题可能会在几个不同的州出现。
在您的示例中,开始状态将是问题" state ?",如果它的答案是"CA“,那么我们将使用"Rent还是Own?”问题转移到下一个状态。对于这个问题的任何答案,下一个州将是“年龄”问题?既然“国家”(State?)->“出租”或“自有”没有进一步的子问题?路径。
对于db模型,需要状态表和状态之间的关系表,即:
表中规定:
表state_state:
在您的代码中,您只需要知道当前状态,询问问题,查询state_state,并将结果与所给出的答案进行比较,以了解下一个状态的id是什么,从而知道下一个问题。
如果您有很多相同问题的状态,您可以创建一个问题表并将其与状态关联。
如果您有几个‘开始问题’,您可以有一个状态机,并将结束问题与下一个‘开始问题’,或者您可以有几个状态机。
发布于 2012-02-12 11:43:26
我们有一个类似的要求来创建定制调查。我们有三个表格,问题,答复和提问路线。response表允许您为每个问题创建多个答案,问题路由表允许您根据特定的回答选择下一个问题。
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
)https://stackoverflow.com/questions/9247519
复制相似问题