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

在Couchbase/CouchDB中设计文档之间的关系?,couchdb,couchbase,nosql,Couchdb,Couchbase,Nosql,学习如何在Couchbase中建立文档之间的关系。也许这个问题用例子问得更好 假设有酒店和客人。许多旅馆和许多客人 { "_id": "hotel1" "type": "hotel" "name": "Hilton" ... } { "_id": "hotel2" "type": "hotel" "name": "Hampton" ... } { "_id" : "guest1" "type": "guest" "name": "John"

学习如何在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次


为酒店建立此类数据关系和检索客人数据的更干净方法是什么

我认为您可以创建一个关系图文档:

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

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

我喜欢这里发布的另一个答案;然而,我不相信有足够的解释,这是教育。如果我正确理解了你的问题,那么这个问题试图克服的设计中有一点缺陷

您必须指出,在每个酒店文档中嵌入客人列表是不可行的。同样,在客户文档中嵌入酒店列表也很麻烦,但也不太现实

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

  • 酒店
  • 客人
  • 预订
  • 预订
    实体应包含客人、酒店以及特定住宿的任何相关详细信息。你不能把这些信息放在酒店或客人的文档中,因为你最终会有太大而不能很好执行的对象(尽管承认这需要一段时间)。当有疑问时,总是在表现好的方面犯错


    正如另一个答案所指出的,创建按酒店和按客人的酒店拉动客人的视图是非常简单的。

    我假设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]
    

    我想指出Couchdb和Couchbase不是一回事,它们的工作方式也不一样。