0

我需要比较 2 个数据库的数据。但是我只需要比较 data而不是 keys,它们可能不同(但对象之间的关系必须相同)。

实际上,需要验证数据转换工具的正常运行。

简单的例子:

我在 C# .Net 和 Sqlite 上使用实体框架,这是数据库架构:

public partial class Document
{
    [PrimaryKey, AutoIncrement]
    public Int64 idDocument { get; set; }
    public string name { get; set; }
}

public partial class Diagram
{
    [PrimaryKey, AutoIncrement]
    public Int64 idDiagram { get; set; }
    public string title { get; set; }
}

public partial class Document_contains_diagram
{
    public Int64 idDocument { get; set; }
    public Int64 idDiagram { get; set; }
}

数据库:

按顺序排列的表格:文档 - 图表 - Document_contains_diagram

身份证件 姓名 id图 标题 身份证件 id图
1 “我的第一个文档” 1 “进化” 1 1
2 “我的第二个文档” 2 “未来” 2 2

应视为与以下内容相同:

身份证件 姓名 id图 标题 身份证件 id图
3 “我的第一个文档” 8 “进化” 3 8
4 “我的第二个文档” 6 “未来” 4 6

这是一个例子,我想要比较的真实数据库包含超过 50 个表,并且通常超过 10000 个条目(RAM 限制也是一个约束)。
所以我正在寻找一个通用的算法,或者一个工具来比较这两个数据库,这可能有助于我的搜索。我见过的所有工具都只检查表的严格相等性。也许将数据库转换为图表会起作用?

4

1 回答 1

0

我不知道有什么自动化工具可以做到这一点,但我建议构建一个一次性解决方案来查找数据的规范排列。然后比较规范版本。

我的意思是这个。您将导出所有数据,并将其导入 SQLite。然后为每个表定义一个规范顺序。然后,您将 ID 迁移到规范 ID,然后迁移所有 ID。重复。

大部分结构可以自动生成。但我建议自动生成一个配置,然后您可以针对始终存在的奇怪边缘情况进行修复。

在您的情况下,配置可能如下所示:

[
    # table, column, orderBy, foreign references
    # each order by is [column list]
    # each foreign reference is [table, column]
    ["Document", "idDocument", ["name"], [["Document_contains_diagram", "idDocument"]]],
    ["Diagram.idDiagram", ["title"], [["Document_contains_diagram", "idDiagram"]]],
    ...
]

你的工具会用它做什么:

For each entry:
    Create a conversion table with a query like:

        create table tmp_convert as (
            select {table}.{id_column} as old_id,
                row_number() over (order by {columns here}) as new_id
            from {table}
        );

    Add an index to tmp_convert.old_id

    Update {table}.{id_column} using tmp_convert

    for each foreign reference:
        Update foreign reference using tmp_convert

    drop tmp_convert

因此,在您的示例中,它将采用第一个数据库,经过大量工作后发现它处于规范顺序。它将使用第二个数据库,并且 foridDocument将在任何地方将 3 替换为 1,将 4 替换为 2。foridDiagram它将用 1 替换 8,将 6 替换为 2。一旦这样做,两个数据库现在是相同的,因此它们将匹配。

于 2022-02-22T21:28:17.903 回答