【发布时间】:2012-03-04 02:05:55
【问题描述】:
我一直在研究动态问答系统,但在为该系统创建高效且灵活的设计时遇到了麻烦。我很想知道是否有既定的设计模式或设计此系统的任何建议。
我想要做什么
我有一系列问题。回答完之后,会显示另一组问题,取决于前一组的答案。如此重复,直到不再需要问题为止。
问题答案都是布尔值、多项选择或数字。
重要的部分是大多数问题仅在满足一组特定条件时才会显示,基于之前的答案。
我需要的条件主要支持布尔逻辑,例如 And、Or、Not、Equals、Greater Than 和 Less Than。
例如,假设我已经收到Age、Gender 和State 等问题的答案。
下一个问题是In School?,但它应该只在以下情况下显示:Age < 30 AND Gender=Male AND (State = CA OR State = NY)
有没有人听说过类似的设计模式?您将如何处理这种设计?
背景资料
我试过数据库列
起初,我们只有 3 个初始问题,所以我们只使用 3 列来过滤第二组问题。
但是,我们的业务需求不断增长,我们开始需要更多初始问题、添加更多列并在这些过滤器中添加更多逻辑。
这很快就变得过于死板和繁琐。
我尝试了一个逻辑解释器
我们让系统更灵活的第二次尝试:将过滤逻辑存储为 JavaScript,并运行 JavaScript 解释器来过滤结果。
这在灵活性方面工作得很好,但是从数据库中检索数千行并解释脚本效率极低,而且对于生产来说性能太差。
我尝试了混合动力
我们最终将这两种方法结合起来,并提出了一些可行的方案。
我们首先根据几个硬编码的数据库列过滤我们的列表,然后使用 JavaScript 解释器进一步过滤列表。
这种混合系统仍然有很多缺点:
- 逻辑在 2 个不同的系统中(SQL 数据库逻辑和 JavaScript 解释器)
- 解释 JavaScript 速度很慢,而且对于所需的简单布尔逻辑来说可能是多余的
- 该系统非常难以维护,尤其是因为 JavaScript 逻辑必须始终由开发人员编写。
我真的很想听听有关如何改进此设计的建议。
其他信息
我的数据库是 MS SQL Server,后端是 .NET C#,JavaScript 解释器是 JINT。 UI 实现并不重要,但它是一个支持 AJAX 的网站,用于提出和回答这些问题。
【问题讨论】:
-
椰子,这是一个非常不寻常的反对理由。你喜欢回答只有一句话的问题吗?
-
您是否考虑过
NoSQL数据库方法?比如MongoDB。? -
@Coconut 我将实际问题移到顶部,并将其他所有内容标记为“背景信息”。希望这有助于简化阅读。
-
@Tigran 我们在系统的其他地方使用了
MongoDB。如果非关系型数据库能提供好的解决方案,我全都听好了! -
@ScottRippey 我有一些类似的要求,并尝试构建一个像你提到的那样的系统,你能否与我分享你的最终解决方案。我想知道设计。谢谢。
标签: c# sql design-patterns database-design