我正在开发一种向导类型的应用程序,允许用户构建基本上根据特定条件执行操作的简单“脚本”。他们构建的脚本将存储在数据库中,并且修改将很常见,因此某些仅向前文本生成不是一种选择。我的程序将这个内部数据库结构转换为我需要的实际脚本输出,所以只要他们修改脚本,我就会重新生成输出。
我正在寻找一些关于良好的数据库结构的建议,以便能够存储这些信息。我现在有一个工作,但我很好奇,如果我错过任何明显的,会使它更清洁一点。任何建议都表示赞赏。
为了提供更多细节,这里是用户可以通过在GUI中选择条件和操作来创建的“脚本”类型的通用化示例:
if ($variableA == 100 && $variableB > 25 && $variableC < 10)
{
performAction();
performAnotherAction();
if ($variableC == 0)
{
performYetAnotherAction();
}
else if ($variableC == 1 || $variableC == 2)
{
performEvenMoreActions();
}
}
else
{
performDefaultAction();
}
关于什么是可能的和不可能的一些注释,只是为了清楚:
$variableA == 100
等),但是每个测试都可以被认为是(<variable>,<operator>,<test value>)
,没有必要担心更复杂的条件。 / LI>
&&
连接,或者总是由||
连接,没有混合。答案 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衍生的规则引擎。