C# 设计一个灵活高效的问答系统
我一直在开发一个动态问答系统,但是我在为这个系统创建一个高效灵活的设计时遇到了困难。我很想知道是否有一个既定的设计模式或任何建议来设计这个系统 我想做什么 我有一系列问题。回答完这些问题后,将显示另一组问题,具体取决于前一组问题的答案。这样重复,直到不需要更多的问题 这些问题的答案都是布尔型、多选型或数字型的 重要的一点是,大多数问题只有在满足一组特定的标准时才会显示,这是基于之前的答案。C# 设计一个灵活高效的问答系统,c#,sql,design-patterns,database-design,C#,Sql,Design Patterns,Database Design,我一直在开发一个动态问答系统,但是我在为这个系统创建一个高效灵活的设计时遇到了困难。我很想知道是否有一个既定的设计模式或任何建议来设计这个系统 我想做什么 我有一系列问题。回答完这些问题后,将显示另一组问题,具体取决于前一组问题的答案。这样重复,直到不需要更多的问题 这些问题的答案都是布尔型、多选型或数字型的 重要的一点是,大多数问题只有在满足一组特定的标准时才会显示,这是基于之前的答案。 我需要的标准主要支持布尔逻辑,如And、Or、Not、Equals、Greater-Than和Lesser
我需要的标准主要支持布尔逻辑,如And、Or、Not、Equals、Greater-Than和Lesser-That 例如,假设我已经收到了诸如
年龄
、性别
、以及州
等问题的答案接下来的一个问题是
在学校?
,但只有在以下情况下才会显示:年龄<30岁,性别=男性和(州=加州或州=纽约)
有人听说过类似的设计模式吗?您将如何处理此设计?
背景资料 我尝试了数据库列 起初,我们只有3个初始问题,所以我们只使用3列筛选第二组问题 然而,我们的业务需求增长了,我们开始需要更多的初始问题,添加更多的专栏,并在这些过滤器中加入更多的逻辑 这很快变得过于僵化和繁琐 我试过逻辑解释器 我们第二次尝试使系统更加灵活:将过滤逻辑存储为JavaScript,并运行JavaScript解释器过滤结果 这在灵活性方面非常有效,但是从数据库中检索数千行并解释脚本的效率非常低,并且对于生产来说执行得太差 我试过混合动力车 我们最终将这两种方法结合起来,提出了一些可行的方法。
我们首先根据几个硬编码的数据库列过滤列表,然后使用JavaScript解释器进一步过滤列表 这种混合动力系统仍有许多缺点:
- 逻辑在两个不同的系统中(SQL数据库逻辑和JavaScript解释器)
- 解释JavaScript的速度很慢,而且对于所需的简单布尔逻辑来说可能有些过分
- 系统很难维护,特别是因为JavaScript逻辑必须始终由开发人员编写
我的数据库是MS SQL Server,后端是.NET C#,JavaScript解释器是JINT。UI实现并不重要,但它是一个支持AJAX的网站,用于询问和回答这些问题。如果我正确理解了您的问题,那么听起来您正在构建一个应用程序 每个状态对应一个问题,根据答案,您将进入一个新问题。同样的问题可能会在几个不同的州出现 在您的示例中,开始状态将是问题“state?”,如果答案是“CA”,那么我们将移动到下一个状态,问题是“Rent还是Own?”。对于该问题的任何答案,下一个州将是“年龄”问题,因为“州?”->“出租还是自有”路径没有其他子问题 对于db模型,需要一个状态表和状态之间的关系表,即: 表中说明:
- id(int)
- 问题(瓦尔查尔)
- 类型(设置[text,boolean,int])
- fromState(int)
- toState(int)
- 应答类型(设置[任意、相等、更大、…])
- 答案(varchar)
如果你有几个“开始问题”,你可以有一个状态机并将结束问题与下一个“开始问题”联系起来,或者你可以有几个状态机。过去我们不得不为医疗系统做类似的事情,因为它的复杂性,我们求助于重用支持多分类决策树的规则引擎。我记得我遇到了一个很好的简单设计,并设法找出了这个链接
该设计与数据存储松散耦合,因此很容易适应现有的解决方案设计 我们对创建自定义调查也有类似的要求。我们有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
)
椰子,这真的是一个不寻常的理由投反对票。你喜欢回答只有一个句子长的问题吗?你有没有考虑过<代码> NoSQL语言>代码>数据库方法?例如,像
MongoDB
。@我将实际问题移到顶部,并将所有其他问题都标记为“背景信息”。希望这有助于简化阅读。@Tigran我们在系统的其他地方使用了MongoDB
。如果一个非关系数据库能提供一个好的解决方案,我洗耳恭听@Scottripey我有一些类似的要求,并试图建立一个像你提到的系统,请你与我分享你的最终解决方案。我想知道设计。谢谢。编辑完你的问题后,我发现这可能不是你想要的。但是,如果您在问题已经得到回答的情况下自动更改状态,那么您可能仍然能够使用该想法。