关系数据库可以处理图结构。 其中一些甚至可以适度优雅地处理它们(就像关系数据库一样优雅!)。

关系数据库中一般图形处理的关键是递归公用表表达式(RCTE),它基本上使您可以通过组合选择根集的查询来迭代(尽管名称不递归)扩展查询集 行的查询和定义到目前为止所选行的邻居的查询。 语法有点笨拙,但是通用且强大。

PostgreSQL,Firebird,SQL Server以及DB2中显然支持RCTE。 Oracle具有不同但等效的构造。 我读到最新版本支持适当的RCTE。 MySQL不支持RCTE。 如果您不喜欢MySQL,我强烈建议您考虑使用PostgreSQL,这基本上是一个更好的数据库。

但是,听起来您不需要支持一般的图形,只需支持树即可。 在这种情况下,会有更多特定的选项可供您使用。

一种是经典的但颇为弯腰的嵌套集。

一种更简单的方法是在每行中存储一个路径:这是一个字符串,代表该行在树中的位置,并且具有以下特性:节点的路径是任何子节点的路径的前缀,这使您非常有效 关于祖先的各种查询(“节点A是节点B的子代?”,“节点A和节点B的最低共同祖先是什么?”等)。 例如,您可以通过从根部遍历树并用斜杠将在行途中遇到的行的ID联接起来来构造行的路径。 这很容易构造,但是如果重新排列树,确实要注意维护。 使用path列,只需添加and path like '23/%'(其中23是根的ID),就可以将查询限制为给定的树。

因此,尽管图形数据库可能是存储和查询图形数据的最佳方法,但它不是唯一的选择,我建议您权衡使用一个数据库的优势与将所有数据存储在一个数据库中的优势。