Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设计一个灵活高效的问答系统_C#_Sql_Design Patterns_Database Design - Fatal编程技术网

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])
表状态\u状态:

  • fromState(int)
  • toState(int)
  • 应答类型(设置[任意、相等、更大、…])
  • 答案(varchar)
在您的代码中,您只需要知道当前状态、提出问题、查询state_state并将结果与给出的答案进行比较,就可以知道下一个状态的id是什么,从而知道下一个问题

如果有许多州都有相同的问题,可以创建一个问题表,并将其与州关联


如果你有几个“开始问题”,你可以有一个状态机并将结束问题与下一个“开始问题”联系起来,或者你可以有几个状态机。

过去我们不得不为医疗系统做类似的事情,因为它的复杂性,我们求助于重用支持多分类决策树的规则引擎。我记得我遇到了一个很好的简单设计,并设法找出了这个链接


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

我们对创建自定义调查也有类似的要求。我们有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我有一些类似的要求,并试图建立一个像你提到的系统,请你与我分享你的最终解决方案。我想知道设计。谢谢。编辑完你的问题后,我发现这可能不是你想要的。但是,如果您在问题已经得到回答的情况下自动更改状态,那么您可能仍然能够使用该想法。