一起执行递归保存还是单独执行?

问题描述

我有一个复杂的对象图,我将其保存到数据库中。这些对象都可以连接到类似类型的其他图形。我希望保存对象图以及它们递归连接的所有图。

汇总所有保存并在一个事务下执行它们是不好的做法吗?每个图形应该单独保存吗?

目前我分别保存每个子图。下面是示例代码(.NET)

public async Task<GraphObj> SaveAllGraphs(GraphObj graph)
{
    foreach (var node in graph.nodes)
    {
        if (node.subGraph != null)
        {
            await SaveGraph(node.subGraph);
        }
    }
    return await SaveGraphInstance(graph);
}
async public Task SaveGraphInstance(GraphObj graph)
{
        var txClient = (ITransactionalGraphClient)_client;
        await txClient.ConnectAsync();

        using (var tx = txClient.BeginTransaction())
        {
            await _client.Cypher.Create(...).ExecuteWithoutResultsAsync();
            await _client.Cypher.Create(...).ExecuteWithoutResultsAsync();
            await tx.CommitAsync();
        }
    }   
}

解决方法

没有真正的答案,因为这取决于您的用例。

如果你的子图等都应该在那里,或者根本不存在,那么你应该在一个事务中完成所有这些。这与其他任何东西都没有什么不同 - 数据库或实际上是应用程序。事务的好处是,它的任何一个部分失败,它都失败了。

就性能而言,这两种方法之间没有真正的区别,都对数据库进行 n 次调用。