答案真的取决于数据增长的规模和速度。在以前的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,这可能适用于您的二手收藏品比较大的情况。如果地点/标签/问题的数量会使产品文档太大。