【问题标题】:How to resolve data confliction如何解决数据冲突
【发布时间】:2013-03-13 10:27:07
【问题描述】:

我有几个数据库,需要在它们之间交换数据。当我从 db A 导出到 db B 时,会发生 Id 冲突。我想出了两种方法,没有一种能让我满意。

  1. 选择 max(id) 然后创建新 id 以避免冲突,但一列存储 json 结构并包含 id! (历史原因)。所以我需要创建新的 ID(主键)并修改该 json 列中的所有 ID。

  2. 或者我可以为每个数据导入添加批处理信息。当我导入数据时,我会找出 sql 中的每个 id 并在它们之前添加批处理 id。如:

原来的db喜欢:

ID     COL_JSON
11     {id:11,name:xx ...} 

我想插入一条新记录:11,插入后我在 id 前添加一个批处理信息“1000”

现在 db 看起来像

ID     COL_JSON
11     {id:11,name:xx ...}  
100011 {id:100011,name:xx ...}  

下一批将是 1001,1002 1003 ...,因此如果需要插入新的 11 条记录,则 db 看起来像

ID     COL_JSON
11     {id:11,name:xx ...}  
100011 {id:100011,name:xx ...}  
100111 {id:100111,name:xx ...}  

虽然这两种方法可以解决冲突,但我觉得这两种方法很愚蠢。有什么优雅的方案吗?

【问题讨论】:

  • 你说的是数据库同步方法吗?
  • 不同步问题。我从应用程序 A 的数据库和一些文件中导出数据,然后导入到应用程序 B(数据库和文件)

标签: java php database database-design


【解决方案1】:

对于遗留系统,除了与它保持一致之外,没有更好的方法。我们无法在遗留系统上对其进行更多更改,因此您的第二种方法似乎不错。坦率地说,这并不愚蠢,而且是正确的方法。

【讨论】:

    【解决方案2】:

    我不完全了解您的数据库交换的内容。

    如果您需要来自两个数据库的数据,您可以使用与您的批处理类似但使用字符的东西 - A11 和 B11 id。

    这样即使你的数据库增长很多也不会发生冲突。

    编辑:您还可以使用两个字段创建主键:具有自动增量的整数 ID 和原始数据库名称的 varchar。

    【讨论】:

    • 感谢统治者。我的问题不仅仅是主键冲突
    【解决方案3】:

    当我有一个应该同步的表(不是即时同步)时,我使用这种方法:

    • 将被覆盖的主表具有很大的自动增量(即:自动增量 = 100000)
    • 将合并到主表的辅助表具有从 1 开始的正常自动增量。

    唯一的要求是您确保主表有足够大的自动增量设置,因此辅助表 id 永远不会到达主表第一个 ID

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-09
      • 2016-02-22
      • 2013-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      相关资源
      最近更新 更多