javascript 和 SQL 之间的共享规则

Posted

技术标签:

【中文标题】javascript 和 SQL 之间的共享规则【英文标题】:Sharing rules between javascript and SQL 【发布时间】:2010-09-27 18:39:33 【问题描述】:

我主要是在这里寻找想法。我的团队购买东西来解决问题的几率非常低,但请继续建议任何有用的商业产品。

基本问题源于以下场景:

    用户将数据输入到表单中,该表单会根据现有数据自动填充一些值。 此数据已保存,一切正常。 会生成一份报告,并与保存的数据同步。 决定自动填充值的数据库内容现在发生了变化。 打开表单,自动填充的值被修改。 如果不保存,报告值也需要更新,但它们不是。

其他细节:

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

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

规则可能如下所示:

如果问题 1 的回答为“是”,则隐藏问题 2 - 10。 如果问题 3 的回答为“否”,则自动对问题 4 回答“X”。 如果问题 1 为“是”,问题 3 为“否”,问题 4 为“是”,则运行方法“whatever”。

我现在有很多可能的解决方案,但其中大多数涉及编写两个解释器(一个在 javascript 中,一个在 sql 中)。虽然这不一定很糟糕,但最好只与一名口译员打交道。

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

更新/修改

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

对此有什么建议吗?

【问题讨论】:

您已经在使用哪些框架/等?因为普通的 ole JavaScript 不能做数据库访问。 为什么每次查看都没有生成报告?是不是很费时间,一定要保存? Byron:每次查看报告都会生成报告,但规则可能相当复杂,构建两个解释器并不是我们理想的时间利用方式。 rlb.usa:我们在服务器上使用 ASP.NET/C#。 【参考方案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 文件(或存储过程 - 以您的设置更有意义的为准。)

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

【讨论】:

到目前为止,您的答案是我们可能使用的最接近的答案。不过,我无法更改客户端或服务器技术。那么,您对在 SQL 存储过程中转换这些规则有什么想法吗? @John -- 我会检查 JSON.org (json.org) 上为 PL/SQL 编写的解析器,如果这些都不合适,我会编写一个解析器。 (向下滚动到底部以找到指向 PL/SQL 中合适实现的链接。) 当然,这只有在您可以将规则传递给 SP 时才有效……或者如果 SP 可以直接拉取规则。【参考方案2】:

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

【讨论】:

什么叫慢速网络?我了解到我们的一些用户在国外使用的是旧的 56kbps 调制解调器。 @John Fisher,我肯定会将其归类为慢速网络。【参考方案3】:

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

【讨论】:

我想我没有提到报告不是由我们的服务器创建的。所以,我们需要使用我们可用的系统。目前,我们只能通过存储过程调用向设计报表提供数据。 (所以如果我们不能通过SQL调用来提供规则,就需要报表设计来实现……)【参考方案4】:

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

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

如果您想为这些用户提供响应和速度,您必须预先考虑将逻辑加载到 JavaScript 文件并让客户端处理它的速度。我会远离 AJAX,因为经常使用 56kbps 调制解调器返回服务器并不好玩。

【讨论】:

我们已经做出了这个决定。困难的部分是避免使用两个解释器(一个在 SQL 中,一个在 javascript 中)来实现规则(一个运行用于报告生成,一个运行在客户端上)。【参考方案5】:

好吧,我最终使用如下语法编写了一些简单的字符串替换“解析器”:

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

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

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

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

【讨论】:

以上是关于javascript 和 SQL 之间的共享规则的主要内容,如果未能解决你的问题,请参考以下文章

在 GWT 中,我们如何在 javascript 和 java 之间共享对象?

JavaScript 在c#和javascript之间共享变量

如何在所有开发者之间共享 FxCop 规则?

用于在用户之间共享数据的 Firestore 安全规则

如何在 Django 和 Javascript 之间共享信息?

在 Jade 和 Javascript 之间共享布局信息