将mySql数据表迁移到Clodant文档

时间:2017-05-23 12:37:22

标签: couchdb cloudant nosql

我们计划从MySql迁移到Cloudant NoSql。我想了解这样做的最佳方法是什么。 我们有5个不同的表 - 产品(ProductId主键),问题(IssueId主键,ProductId外键)和标签(标签ID主键,ProductId外键)和位置(LocationId主键位置作为外键,在产品中有位置)表)和Policy(policyId主键,IssueId作为主键)。

现在我们想到了两种在Cloudant中维护文档的方法。

  1. 为每一行保留不同的文档,每个表具有唯一的文档类型(对于每个表,一个文档类型,文档类型为"产品","问题,"标记&# 34;," location"," policy")。

  2. 为每一行保留不同的文档,并在一个文档中定义所有关系(所有类型为#34的文档;产品"仅保留所有标签,问题[政策],每个产品的位置)。

  3. 哪种方法更好?

1 个答案:

答案 0 :(得分:0)

答案实际上取决于数据增长的规模和速度。在以前的SQL-> NoSQL迁移中,我使用了你的第二种方法(我不知道你的确切模式,所以我猜):

{ 
   _id: "prod1",
   name: "My product",
   tags: [
     "red", "sport", "new"
   ],
   locations: [
     {
       location_id: "55",
       name: "London",
       latitude: 51.3,
       longitude: 0.1
     }
   ],
   issues: [
     {
       issue_id: "466",
       policy_id: "88",
       name: "issue name"
     }
   ]
}

此方法允许您在单个Cloudant API调用(GET /products/prod1)中获取有关产品的几乎所有内容。这样的调用将为您提供所有主要产品数据以及在SQL世界中加入的内容 - 在这种情况下是事物数组或对象数组。

您可能仍需要另一个locationspolicies数据库,因为您可能希望在单独的集合中存储有关这些对象的额外信息,但您可以存储子集产品文档中的数据(例如,位置的名称和地理位置)。这意味着从每个产品中的参考“位置”集合中复制一些数据,但在查询时提高效率(以更复杂的数据为代价)。

这完全取决于您如何访问数据。为了提高速度和效率,您希望能够在尽可能少的API调用中检索呈现页面所需的数据。如果将所有内容保存在自己的数据库中,则需要自己进行连接,因为Cloudant没有连接。这样效率很低,因为每个“连接”都需要额外的API调用。

another way to managed "joins" in Cloudant,如果你的二次收藏很大,这可能是合适的。如果位置/标签/问题的数量会使产品文档尺寸过大。