在javascript和SQL之间共享规则

时间:2010-09-27 18:39:33

标签: .net javascript sql oracle

我主要在这里寻找想法。我的团队购买一些东西以解决问题的可能性非常低,但请继续推荐任何有用的商业产品。

基本问题源于以下情况:

  1. 用户将数据输入到表单中,该表单根据现有数据自动填充一些值。
  2. 此数据已保存,一切都很棒。
  3. 生成报告,并与保存的数据保持同步。
  4. 确定自动填充值的数据库内容现在更改。
  5. 打开表单,修改自动填充的值。
  6. 不保存,报告值也需要更新,但它们不是。
  7. 其他细节:

    • 我们的报告解决方案要求答案和规则评估都来自Oracle数据库中的存储过程或查询。
    • 表单在浏览器中运行。
    • 根据自动填充的值,表单/报告的某些部分将可见或不可见。

    问题: 如何以一种我可以从javascript和SQL轻松评估它们的方式实现一组规则(存储在数据库中)?

    规则可能如下所示:

    • 如果问题1的回答为“是”,请隐藏问题2 - 10.
    • 如果问题3的回答为“否”,则自动回答问题4的“X”。
    • 如果问题1为“是”且问题3为“否”且问题4为“是”,则运行方法“无论如何”。

    我现在脑子里有许多可能的解决方案,但大多数都涉及编写两个解释器(一个用javascript,一个用在sql中)。虽然这不一定是可怕的,但只处理一个翻译是最好的。

    此外,客户端需要在用户输入值时更新表单,因此每次用户更改答案时弹回数据库都不太可能是一个实用的解决方案。

    更新/修改

    我目前倾向于实现可以通过javascript直接评估的规则(包含规则的一些代码),并通过存储过程转换/处理为可以评估Oracle中规则的动态sql。 / p>

    对此有何建议?

5 个答案:

答案 0 :(得分:1)

使用JSON。

在JSON文件中定义规则 - 它可能如下所示:

[
    {
        name: "my_first_rule",
        validation: {
            common: ["required", "[0-9]+"]
            // If you had rules that needed different implementations in .NET
            // vs. Javascript you could set those up as separate attributes here
            // i.e. js: ["some_complex_regex_or_fuction_call"],
            //      net: ["which_needs_to_be_different_in_.NET"]
        },
    {
        name: "my_second_rule",
        validation: {
            common: ["required", "\w+"]
        }
    }
]

解析这些规则并使用它们来驱动前端javascript和后端.aspx文件(或存储过程 - 以您的设置更有意义。)

如果您不仅要避免编写两组规则,还要编写两组规则解释器,然后使用Node.js或者调用嵌入式JScript解释器(或独立的Rhino / Spidermonkey环境)可能是要走的路(在客户端切换到Silverlight并在.NET中编写所有验证可能是另一种方法 - 如果你有用户然而,56K调制解调器,他们可能不会感谢您的选择。)

答案 1 :(得分:0)

每次用户进行更改时轮询数据库并不像您想象的那样不切实际,除非您的网络速度很慢。如果Google即时可以在每次输入字符时执行网络搜索,我认为每次用户回答问题时您都可以设法执行ajax调用。

答案 2 :(得分:0)

这可能是http://nodejs.org/的一个很好的用例。使用服务器端Javascript,您只需在JS中开发一次API。您可能需要在服务器或客户端上稍微扩展它,但它至少会消除部分负担。

答案 3 :(得分:0)

我认为您在评论中回答了自己的问题:

  

据我所知,我们的一些用户使用的是国外旧的56kbps调制解调器

如果您希望这些用户具有响应速度和速度,则必须将将逻辑加载到JavaScript文件并让客户端处理它的前期缓慢。我会远离AJAX,因为使用56kbps调制解调器回到服务器很多都不会很有趣。

答案 4 :(得分:0)

好吧,我最后使用类似这样的语法编写了一些简单的字符串替换“解析器”:

Condition: '{Question = "1" and Answer = "Y"} and {Question = "2" and Answer = "N"}',
Action: 'Hide',
Target: '3'

在数据库中,Condition,Action和Target字段是一行中包含更多有用信息的列。在javascript中,它将是一个JSON对象。

在JavaScript中用PL / SQL和Repace(/.../g)做一些简单的REGEXP_REPLACE,我可以到达我们需要的位置 - 而不会在解析器上浪费太多时间。 (正在测试的javascript对象将具有与条件中的属性匹配的属性,并且正在测试的数据库行将具有相同的列名。)

事实证明,我们最终会使用多个解释器,但通过字符串替换保持简单,这并不是很痛苦。