如何解决数据冲突

时间:2013-03-13 10:27:08

标签: java php database database-design

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

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

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

  3. 原始数据库如:

    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 ...}  
    

    虽然这两种方法可以解决冲突,但我觉得这两种方法都很愚蠢。有一些优雅的计划吗?

3 个答案:

答案 0 :(得分:1)

对于遗留系统,没有更好的方法,除非与它对齐。我们无法在遗留系统上进行更多更改,因此您的第二种方法似乎很好。坦率地说,这不是愚蠢而且是正确的方法。

答案 1 :(得分:0)

我不清楚你的数据库交换的确切内容。

如果您需要两个数据库中的数据,您可以使用与您的批次类似的东西,但使用字符 - A11和B11 ID。

这样即使您的数据库增长很多,也不会有冲突。

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

答案 2 :(得分:0)

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

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

唯一的要求是确保主表设置了足够大的自动更新,因此辅助表ID永远不会到达主表ID