我可以将模型从嵌入式更改为引用而不会丢失数据吗?

时间:2011-02-01 03:06:06

标签: ruby-on-rails-3 mongodb mongoid

我做了一个糟糕的决定,因为我正在设计一个MongoDB数据库来嵌入模型而不是在相关模型中引用它。现在我需要将嵌入式模型作为引用模型,但数据库(或文档?)中已经存在大量数据。

我正在使用Mongoid,所以我推断我可以将embedded_in更改为referenced_in。在我开始之前,我想我会问那些比我更了解的人。如何将数据库中已有的嵌入数据转换为关联模型的文档。

class Building

  embeds_many :landlords

..
end

class Landlord 
  embedded_in :building
...
end

2 个答案:

答案 0 :(得分:0)

简短回答 - 递增。

  1. 创建一个Landlord副本,将其命名为Landlord2。
  2. 在Building。中引用它。
  3. 将所有数据从Landlord复制到Landlord2。
  4. 删除房东。
  5. 将Landlord2重命名为Landlord。
  6. 在步骤3-5(理想情况下),用户不应该能够使用CRUD Landlord。你仍然可以在4-5只锁定CRUD。只需确保在删除Landlords之前进行复制期间发生的所有更新。

答案 1 :(得分:0)

就像你上面的模型一样无法工作,旧数据仍将在数据库中的不同结构中。

与之前的答案非常相似,我以前做过此迁移的一件事就是动态地执行此操作,同时系统正在运行并由用户使用。

我将数据层与逻辑分开,因此我可以添加一些预处理器并注入代码来执行以下操作。

让我们说我们从旧的datamodel开始,然后发布执行以下操作的新代码: 在每次访问文档时,您都必须检查嵌入属性是否存在,如果存在,则创建与参考关联的新条目并保存到数据库并从文档中删除嵌入属性。一旦完成这几天,我的很多数据都被迁移了,然后我只需要为未触及的所有内容运行类似的脚本,使得迁移数据的工作变得更加容易和简单而且我没有运行长时间运行的脚本或使系统脱机以执行转换。

你可能没有这个要求,所以选择相应的。