条件操作的数据库设计

时间:2009-05-28 16:13:55

标签: database-design scripting conditional

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

我正在寻找一些关于良好的数据库结构的建议,以便能够存储这些信息。我现在有一个工作,但我很好奇,如果我错过任何明显的,会使它更清洁一点。任何建议都表示赞赏。

为了提供更多细节,这里是用户可以通过在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>),没有必要担心更复杂的条件。 / LI>
  • 即使每个条件都可以有任意数量的测试,它们也总是由相同的布尔运算符连接。也就是说,如果条件中有多个测试,则它们总是由&&连接,或者总是由||连接,没有混合。
  • 条件可以无限嵌套,因此需要某种层次结构。
  • 内部条件可能有任意数量的操作,必须按照它们定义的相同顺序执行。操作可以简单地表示为函数名称,不需要担心任何其他“操作类型”。 / LI>

3 个答案:

答案 0 :(得分:2)

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

主要原因是在层次结构中表达和计算诸如(a和b和(c或(d和e))之类的东西要容易得多。

在你的例子中,嵌套是条件,所以类似于。 (非常粗糙,只是为了提出一个想法)

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

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

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

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分:1)

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

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