在Couchbase / CouchDB中设计文档之间的关系?

时间:2014-11-20 17:10:01

标签: couchdb couchbase nosql

学习如何在Couchbase中建立文档之间的关系。也许这个问题更好地用例子来说。

假设有酒店和宾客。很多酒店和很多客人。

{
  "_id": "hotel1"
  "type": "hotel"
  "name": "Hilton"
  ...
}

{
  "_id": "hotel2"
  "type": "hotel"
  "name": "Hampton"
  ...
}


{
  "_id" : "guest1"
  "type": "guest"
  "name": "John"
  ...
}
{
  "_id" : "guest2"
  "type": "guest"
  "name": "Erin"
  ...
}

建立关系的一种方法是在酒店文档中嵌入访客ID,但这会随着时间的推移而变得非常大。

另一种方法是在客人文档中嵌入酒店ID,并为每个酒店创建视图以列出其客人。由于酒店随着时间的推移而添加,因此无论何时创建酒店文档,都需要动态添加这些视如果有500家酒店,他们将有500个观看次数。

为此类数据建立关系以及检索酒店客人数据的更简洁方法是什么?

3 个答案:

答案 0 :(得分:3)

我喜欢这里发布的其他答案;但是,我不相信有足够的解释,因为这是教育。如果我正确理解你的问题,那么设计中存在一些问题就是要克服这个问题。

您需要指出在每个酒店文档中嵌入访客列表是不可行的。同样,在客人文档中嵌入酒店列表也很麻烦,但并不那么不现实。

我在这里缺少的是,酒店需要三个实体才能入住:

  1. 饭店
  2. 访客
  3. 预订
  4. Reservation实体应包含访客,酒店以及特定住宿的任何相关详细信息。您不能将此信息放入酒店或访客文档中,因为您最终会有太大而无法正常运行的对象(尽管这可能需要一段时间)。如果有疑问,总是在表现良好的方面犯错。

    就像其他答案所指出的那样,创建由宾馆和宾馆宾客拉客人的观点是非常微不足道的。

答案 1 :(得分:3)

假设Couchbase视图的工作方式与CouchDB视图相同。

将酒店ID放入访客文档中。只有一个视图,为客人访问的每家酒店发出一个复杂的密钥。例如

for (var visit in guest.hotels) {
    emit([visit.hotel_id, visit.date], guest_id);
}

然后,您可以通过

查询视图来获取酒店的访客列表
startkey = ['hotel1'] and endkey = ['hotel1', {}]

您还可以在特定日期之间获取访客列表:

startkey = ['hotel1', date1] and endkey = ['hotel1', date2]

答案 2 :(得分:1)

我认为在您的情况下,您可以创建关系地图文档:

{
  "hotel_id": "hotel1",
  "guest_id": "guest1"
}

因此它将存储酒店/客人ID。然后,您可以创建2个通用视图:" ListHotelGuests"和" ListGuestHotels"。您可以根据应用程序业务逻辑对这些视图进行过滤,分组等。