2017-05-23 23 views
0

我们计划从MySql迁移到Cloudant NoSql。我想了解什么是最好的方法来做到这一点。 我们有5个不同的表 - 产品(ProductId主键),问题(IssueId主键,ProductId外键)和标签(Tag id主键,ProductId外键)和位置(LocationId主键位置为外键,位置在产品表)和Policy(policyId主键,IssueId作为主键)。将mySql数据表迁移到Clodant文档

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

  1. 保持不同的文件与唯一的文档类型每行每表(每个表一个文档类型前的文档类型为“产品”,“问题”标签”,‘位置’,‘政策’)。

  2. 保持不同的文档与一个文档中定义的所有关系,各行(用型“产品”只在维护所有标签,问题[政策],每个产品位置的所有文件)。

哪方法更好吗?

回答

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,这可能适用于您的二手收藏品比较大的情况。如果地点/标签/问题的数量会使产品文档太大。