2

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

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

为了提供更多细节,下面是用户可以通过在 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等),但是每个测试都可以被认为是表示为(<variable>,<operator>,<test value>),无需担心更复杂的条件。
  • 即使每个条件可以有任意数量的测试,它们总是会被同一个布尔运算符连接起来。也就是说,如果条件中有多个测试,它们要么总是由 连接&&,要么总是由 连接||,没有混合。
  • 条件可以无限嵌套,因此需要某种层次结构。
  • 在条件句中可能有任意数量的动作,它们必须按照它们定义的顺序执行。动作可以简单地表示为函数名称,无需担心任何其他“动作类型”。
4

3 回答 3

2

每当我不得不存储/操作“类似代码”的东西时,我总是会走上 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 格式来维护层次结构,它对于获取与节点相关的所有数据等更有用。

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

于 2009-05-28T16:31:36.683 回答
1

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

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

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

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

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

于 2009-05-28T16:33:06.320 回答
1

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

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

于 2009-05-28T16:46:38.867 回答