【问题标题】:Database design for conditional actions条件动作的数据库设计
【发布时间】:2009-05-28 16:13:54
【问题描述】:

我正在开发一个向导类型的应用程序,以允许用户构建简单的“脚本”,这些脚本基本上可以根据特定条件执行操作。他们构建的脚本将存储在数据库中,并且修改将很常见,因此某种只进文本生成不是一种选择。我的程序将此内部数据库结构转换为我需要的实际脚本输出,因此只要他们修改脚本,我就会重新生成输出。

我正在寻找一些关于能够存储这些信息的良好数据库结构的建议。我目前有一个正在工作,但我很好奇我是否错过了任何可以使它更清晰的明显内容.任何建议表示赞赏。

为了提供更多细节,下面是用户可以通过在 GUI 中选择条件和操作来创建“脚本”类型的通用示例:

if ($variableA == 100 && $variableB > 25 && $variableC < 10)
{
    performAction();
    performAnotherAction();
    if ($variableC == 0)
    {
        performYetAnotherAction();
    }
    else if ($variableC == 1 || $variableC == 2)
    {
        performEvenMoreActions();
    }
}
else
{
    performDefaultAction();
}

一些关于什么是可能的和不可能的注释,只是为了清楚:

  • “if”条件可以附加任意数量的“else if”条件,以及可选的“else”。
  • 每个条件都可以有任意数量的“测试”($variableA == 100 等),但是每个测试都可以被视为表示为(&lt;variable&gt;,&lt;operator&gt;,&lt;test value&gt;),无需担心更复杂的条件。
  • 即使每个条件可以有任意数量的测试,它们总是由同一个布尔运算符连接。也就是说,如果条件中有多个测试,它们要么总是由&amp;&amp; 连接,要么总是由|| 连接,没有混合。
  • 条件可以无限嵌套,因此需要某种层次结构。
  • 在条件句中可能有任意数量的动作,这些动作必须按照它们定义的顺序执行。动作可以简单地表示为函数名称,无需担心任何其他“动作类型”。

【问题讨论】:

    标签: database-design scripting conditional


    【解决方案1】:

    每当我不得不存储/操作“类似代码”的东西时,我总是会走 XML 路线。

    主要原因是在层次结构中表达然后计算类似 (a and b and (c or (d and e))) 的东西要容易得多。

    在您的示例中,嵌套是条件句之类的。 (很粗略,仅供参考)

    <if>
        <expression />
        <true>
            <action />
        </true>
        <false>
            <if>
                <expression />
                <true>
                    <action />
                </true>
            </if>
        </false>
    </if>
    

    如果您使用的是 SQL2005+,它具有 HierarchyId 数据类型,您可以使用它而不是 XML 格式来维护层次结构,它对于获取与节点相关的所有数据等更有用。

    注意:这绝不是一个完整的答案,甚至不是部分答案,只是抛出一些经验。

    【讨论】:

    • 每当我尝试将 XML 转换为一种编程语言(并且我已经这样做了很多次)时,我最终都会产生无法阅读的内容。如果您想要一种编程语言,请使用一种编程语言——XML 解析的难易程度不应该影响您。
    【解决方案2】:

    您没有描述使用 SQL 获取或搜索脚本片段的任何要求,因此无需分解脚本。

    所以我不会尝试将脚本巧妙地存储在数据库中。相反,只需将整个脚本存储在文本 BLOB 中,并将脚本视为一个相对于其存储的单个原子值。

    您对脚本所做的任何操作都将在您的应用程序中完成,因此您需要一个解析器。所以选择一个易于解析的简单语法。我建议使用 Python、XML 或您自己的领域特定语言。

    FWIW,我在数据库和解析器方面都有丰富的经验。就您对项目的描述而言,这不是一项非常艰巨的任务,只是完全没有必要。

    底线:代码就是代码,数据就是数据。

    【讨论】:

    • 是的,没错。我想我只是想为未来保留我的选择,但也许我过度设计了。
    • 如果您需要能够修改脚本就可以了。但是 RDBMS 并不是完成这项工作的最佳工具。尝试将脚本分解为句法元素并将它们存储在数据库中将阻碍而不是帮助未来的灵活性。
    【解决方案3】:

    您可以使用对其父节点的引用来表示每个节点,然后加入父节点以使子节点退出。这是在关系数据库中表示层次结构的标准方法。

    或者,如果每个规则都是离散的,您可以用文本或 XML 格式表示它,并将规则存储在一个 blob 中。如果您要处理大量此类规则,您可能需要考虑使用现成的基于 Rete-derivative 的规则引擎,例如 Ilog。

    【讨论】:

      猜你喜欢
      • 2016-05-29
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      相关资源
      最近更新 更多