代码之家  ›  专栏  ›  技术社区  ›  John Fisher

JavaScript和SQL之间的共享规则

  •  3
  • John Fisher  · 技术社区  · 14 年前

    我主要在这里寻找想法。我的团队购买解决问题的产品的几率非常低,但请继续推荐任何有帮助的商业产品。

    基本问题源于以下场景:

    1. 用户将数据输入表单,表单根据现有数据自动填充某些值。
    2. 这些数据被保存,一切都很好。
    3. 将生成一个报告,该报告与保存的数据同步。
    4. 决定自动填充值的数据库内容现在更改。
    5. 打开窗体时,将修改自动填充的值。
    6. 如果不保存,报表值也需要更新,但不需要更新。

    其他细节:

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

    问题: 我如何实现一组规则(存储在数据库中),使我能够轻松地从JavaScript和SQL中评估它们?

    规则可能类似于以下任一规则:

    • 如果问题1的答案是“是”,则隐藏问题2-10。
    • 如果问题3回答为“否”,则自动回答问题4的“x”。
    • 如果问题1为“是”,问题3为“否”,问题4为“是”,则运行方法“随便”。

    我现在有许多可能的解决方案正在我的脑海中运行,但大多数解决方案都涉及编写两个解释程序(一个在javascript中,一个在SQL中)。虽然这并不一定可怕,但最好只与一名口译员打交道。

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

    更新/修改

    我目前倾向于实现可以由javascript直接评估的规则(有一些围绕规则的代码),并将存储过程转换/处理为可以在Oracle中评估规则的动态SQL。

    有什么建议吗?

    5 回复  |  直到 14 年前
        1
  •  1
  •   Sean Vieira    14 年前

    使用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调制解调器上,他们可能不会感谢您的THA。t选择。

        2
  •  0
  •   mikerobi    14 年前

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

        3
  •  0
  •   BBonifield    14 年前

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

        4
  •  0
  •   Martin    14 年前

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

    我了解到我们的一些用户使用的是国外的旧56kbps调制解调器。

    如果您想要对这些用户提供响应速度和速度,那么您必须先将逻辑加载到一个javascript文件中,然后让客户机处理它。我会远离Ajax,因为使用56kbps调制解调器经常返回服务器并不是一件有趣的事情。

        5
  •  0
  •   John Fisher    14 年前

    好吧,我最后用如下语法编写了一些简单的字符串替换“parsers”:

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

    在数据库中,条件、操作和目标字段是一行中包含一些更有用信息的列。在JavaScript中,它将是一个JSON对象。

    在pl/sql中做一些简单的regexp_替换,在javascript中做repace(/…/g),我可以到达我们需要的地方——而不会在解析器上浪费太多时间。(要测试的javascript对象将具有与条件中的属性匹配的属性,并且要测试的数据库行将具有相同的列名。)

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

    推荐文章