【问题标题】:Designing a relationship between documents in Couchbase/CouchDB?在 Couchbase/CouchDB 中设计文档之间的关系?
【发布时间】:2017-09-20 18:52:37
【问题描述】:

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

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

【问题讨论】:

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

标签: couchdb couchbase nosql


【解决方案1】:

我假设 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. 酒店
    2. 客人
    3. 预订

    Reservation 实体应包含客人、酒店以及特定住宿的任何相关详细信息。您不能将此信息放入 Hotel 或 Guest 文档中,因为您最终将拥有太大而无法正常运行的对象(尽管这需要一段时间)。如有疑问,请始终选择良好的性能。

    就像其他答案指出的那样,创建按酒店和按客人的酒店拉客人的视图非常简单。

    【讨论】:

      【解决方案3】:

      我认为在你的情况下你可以创建一个关系图文档:

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

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

      【讨论】:

        猜你喜欢
        • 2013-07-15
        • 1970-01-01
        • 2016-04-03
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 2014-01-14
        • 2012-09-12
        相关资源
        最近更新 更多