Database design 条件动作的数据库设计

Database design 条件动作的数据库设计,database-design,scripting,conditional,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($variableA==100&&$variableB>25&&$variableC<10)
{
性能();
执行治疗作用();
如果($variableC==0)
{
performytanotheraction();
}
else if($variableC==1 | |$variableC==2)
{
执行更多操作();
}
}
其他的
{
performDefaultAction();
}
关于什么是可能的,什么是不可能的,只是为了清楚起见:

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

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

主要原因是,在层次结构中,表达和计算类似(a和b以及(c或(d和e))的内容要容易得多

在您的示例中,嵌套是条件语句,类似于。(非常粗略,只是想说明一下)


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


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

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

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

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

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


一句话:代码就是代码,数据就是数据。

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


或者,如果每个规则都是离散的,则可以用文本或XML格式表示它,并将规则存储在blob中。如果你正在处理大量的这些规则,你可能想考虑使用一个现成的基于ReTE导数的规则引擎,比如ILOG。< / P>是的,这是真的。我想我只是想让我的选择对未来开放,但也许我设计过度了。如果你需要能够修改脚本就可以了。但是RDBMS并不是完成这项工作的最佳工具。尝试将脚本分解为语法元素并存储在数据库中会阻碍而不是帮助未来的灵活性。每当我尝试将XML转换为编程语言时(我已经做了很多次),我最终都会产生不可读的goo。如果您想要一种编程语言,请使用一种编程语言——XML解析的简单性在这里不应该影响您。
<if>
    <expression />
    <true>
        <action />
    </true>
    <false>
        <if>
            <expression />
            <true>
                <action />
            </true>
        </if>
    </false>
</if>