我们计划从MySql迁移到Cloudant NoSql。我想了解这样做的最佳方法是什么。 我们有5个不同的表 - 产品(ProductId主键),问题(IssueId主键,ProductId外键)和标签(标签ID主键,ProductId外键)和位置(LocationId主键位置作为外键,在产品中有位置)表)和Policy(policyId主键,IssueId作为主键)。
现在我们想到了两种在Cloudant中维护文档的方法。
为每一行保留不同的文档,每个表具有唯一的文档类型(对于每个表,一个文档类型,文档类型为"产品","问题,"标记&# 34;," location"," policy")。
为每一行保留不同的文档,并在一个文档中定义所有关系(所有类型为#34的文档;产品"仅保留所有标签,问题[政策],每个产品的位置)。
哪种方法更好?
答案 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世界中加入的内容 - 在这种情况下是事物数组或对象数组。
您可能仍需要另一个locations
或policies
数据库,因为您可能希望在单独的集合中存储有关这些对象的额外信息,但您可以存储子集产品文档中的数据(例如,位置的名称和地理位置)。这意味着从每个产品中的参考“位置”集合中复制一些数据,但在查询时提高效率(以更复杂的数据为代价)。
这完全取决于您如何访问数据。为了提高速度和效率,您希望能够在尽可能少的API调用中检索呈现页面所需的数据。如果将所有内容保存在自己的数据库中,则需要自己进行连接,因为Cloudant没有连接。这样效率很低,因为每个“连接”都需要额外的API调用。
有another way to managed "joins" in Cloudant,如果你的二次收藏很大,这可能是合适的。如果位置/标签/问题的数量会使产品文档尺寸过大。