我有一个小而复杂的数据库(几百万条记录分成非常少的数千张表)。这些记录可以被认为是业务规则。用户可以根据现有规则(包括其他用户定义的规则)定义自己的规则。这些规则依赖于其他规则,有时通过复杂的路径。依赖关系形成一个扩展的网络,而不是一个层次结构。
我正在寻找一种算法来确定,在新定义的规则(或规则集)中,新规则本身是否是循环的,或者它是否与现有规则一起创建循环。
我需要一种在以下情况下有效的算法:
- 算法的结果只需要是一个布尔值 - 如果有一个循环,则为 true,否则为 false。
- 可以假设现有数据库是无循环的。
- 一旦发现循环,处理就可以停止。通常的情况(95% ??)是没有循环。不幸的是,这正是(我认为)处理必须完成提议的新规则的所有可能路径的情况,以确定没有循环。
- 该算法用于验证新的用户定义规则,因为它们被输入到数据库中。对于通常的情况,它需要尽可能快——我不希望这种验证成为创建过程中的瓶颈。
- 获取数据的成本相对较高——通常涉及一个或多个查询,其中一些非常复杂。新定义的规则集可以被约束以便在内存中完全可用。如果可以对新规则的输入施加任何其他限制,这将有助于提高检查的效率,我不知道它们可能是什么。
编辑
我接受了尼克的回答,但做了一处修改。存储依赖项是对数据库的一个非常简单的修改。我将只存储直接依赖项而不是所有依赖项,无论是直接的还是间接的。我可以将两组依赖项 C、D、F、G 和 X、Y、Z(在尼克的回答中)视为树结构,并使用各种技术中的一种从单级依赖表派生层次结构。我认为在这种情况下,这样做的成本是可以接受的。
编辑