【问题标题】:Rails - Migrating data to another DB with different IDsRails - 将数据迁移到具有不同 ID 的另一个数据库
【发布时间】:2016-09-01 18:45:37
【问题描述】:

我有一个场景,我需要将一个用户的数据从我的 Rails 应用程序转储/传输到另一个具有相同配置和表的数据库。例如,应用程序构建为

  class Company < ActiveRecord::Base
    has_many :depots
    has_many :users
  end

  class Depot < ActiveRecord::Base
    belongs_to :company
    has_many :products
  end

  class User < ActiveRecord::Base
    belongs_to :company
  end

  class Product < ActiveRecord::Base
    belongs_to :depot
  end

我的要求是,如果 companyA 停止付款,我想将他们的数据转储到另一个数据库(例如 databse2)以保持我的实际数据库清洁,一旦他们回来并开始付款,我希望这些数据回来。

第二个要求是,database2 中已经可以有一些数据。所以我需要保留所有记录,并且我想更改 companyA 的 ID(因为可能已经有一家公司具有相同的 ID),同时保存到 database2 中保持关联不变。这样做似乎很愚蠢,但这是我的要求。 我使用 Postgres 作为我的应用程序数据库。 有什么帮助???

【问题讨论】:

  • 这听起来很乱,但只要您不更改任何 ID 并且不更改您的序列生成器,您就会没事的。切勿重新签发 ID。这简直是​​鲁莽。由于一个简单的错误,您冒着一家公司“继承”另一家公司数据的风险。
  • 我试图克隆记录,然后使用 ActiveRecord 和 Amoeba 之类的 gem 将其保存到新数据库,但这会弄乱所有应用程序,因为我在 nil 父级的模型中有很多验证- id 约束。
  • 您需要问自己的第一个问题是存储开销是否足够严重,您首先真的需要这样做。要调查的第二件事是您是否可以简单地序列化所有内容并将其作为文件转储,然后稍后将其反序列化回您的数据库。您可以以 gzip 为例在 JSON 中执行此操作。除非您需要在线数据,否则没有明确需要第二个数据库,如果需要,请将其保存在主数据库中。
  • 无论你在这里做什么,操作越低级越好。不惜一切代价保留 ID。不要填坑。避免使用模型,因为它们会改变创建/更新的时间戳字段。
  • 未来我将拥有几家拥有大量数据的公司。在数据库中保留不必要的数据是一种开销。其次,我的客户的要求不太可能引起争议:-(。我也尝试将其另存为 JSON,但我的问题是 ID。如果我将 JSON 数据恢复到原始数据库中,则解析时可能会损坏它。第二个数据库的好处是,我可以随时将它连接到 ActiveRecord 以向公司展示。

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord associations


【解决方案1】:

这里有几个值得研究的选项:

  1. 在单个 JSON 文件中输出所有内容,该文件对客户端在数据库中的所有内容进行编码,并带有 ID 字段。
  2. 转储出一系列可导入目标服务器的 CSV 文件。
  3. 转储一个 .sql 文件,只需运行该文件即可正确恢复数据。

第一个选项是最优雅的,但可能需要最多的工作。它使您能够将数据归档在一个易于解析的整洁文件中。

第二个选项可能很好,也可能非常难看,具体取决于您拥有的数据类型。如果涉及任何二进制数据,这可能不起作用,但对于干净的纯文本列和表格数据,它通常相当有效。这样做的好处是您可以选择性地加载部分数据,而无需解析所有数据。

第三个选项不容易解析,您需要恢复它才能使用它,但它确实使插入非常非常简单。您只需要编写一个存档器,不需要特定的恢复工具。

无论您采取何种方法,您都需要绝对确定 ID 号码永远不会重新签发。不要重置您的序列生成器以填补漏洞,并且在移动数据库时也将它们移植过来并测试它们是否设置正确。您最不需要的就是 ID 冲突。

如果您真的担心 ID 冲突,您可能希望切换到非数字 ID,例如在冲突基本上不相关的所有内容中使用 UUID,尽管这并非没有代价。

【讨论】:

  • 让我们试一试,看看事情是否得到了整理。
猜你喜欢
  • 2016-01-20
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
相关资源
最近更新 更多