【问题标题】:Best way of structuring documents in Cloud Firestore (NoSQL databases)?在 Cloud Firestore(NoSQL 数据库)中构建文档的最佳方式?
【发布时间】:2020-01-21 12:37:17
【问题描述】:

我正在尝试实现 Firestore 云数据库,但我是 NoSQL 数据库的新手。

我想知道将这些集合安排到集合/文档中的最佳方式是什么:

我有餐厅,有不同的食物预订。将这些数据集构建到 Firestore DB 中的最佳方法是什么?

这是一个正确的方法吗:

Restaurant1 (Collection)
----> Foods (document) 
----> Reservations (document)

【问题讨论】:

  • 我们通常根据要执行的查询来构建 Firestore 数据库。这些查询是什么?
  • @AlexMamo 例如,用户将进行预订、预订食物、显示描述、食物和一家餐厅的所有详细信息等。
  • “将保留食物”似乎不是一个查询,另一个与显示详细信息有关,而不是查询/搜索。
  • 会有餐厅端应用和客户端应用。因此,假设当客户进行预订时,餐厅的管理层应该能够在列表中看到他的预订以及其他客户的其他预订。每个客户也应该能够看到他的预订历史。这只是一个示例,因为功能远不止这些。
  • 如果您认为这对您有帮助,我可以尝试为您提供适合此查询的模式:餐厅的管理层应该能够看到他的预订以及其他来自其他客户的预订,在列表中。每个客户也应该能够看到他的预订历史。。在不知道其他问题的情况下,我帮不上什么忙。

标签: database firebase google-cloud-firestore structure


【解决方案1】:

我认为将 Foods 和 Reservations 存储为顶级集合最终会在以后为您带来更大的灵活性。

获取一个 restaurantID 并将其粘贴到这些集合中的每个文档中很容易,因此我个人认为您不应该将它们嵌套在 Restaurants 集合中。这是处理大量嵌套集合的个人偏好。

我认为最佳结构是:

Restaurants (collection)
--- Name: Chipotle
--- ID: restaurant1
--- Foods: [{ Name: foodItem1 }, { Name: foodItem2 }]

Foods (collection)
--- Name: foodItem1
--- Ingredients: abc
--- Nutrition Facts: xyz

Reservations (collection)
--- User: user1
--- Restaurant: { id: restaurant1, name: Chipotle }
--- Time: 3pm

Users (collection)
--- ID: user1

您会注意到有一些多余的信息。这很好,所以如果您请求所有预订,您将获得餐厅的名称和 ID 等您可能想要的东西。您会发现您需要多次存储数据,这对我来说是一个很好的结构。

使用这种结构,您可以非常轻松地调用:

All reservations by user XAll foods meeting nutrition limits of Y

而不是 collectionGroup 查询,它会调用所有餐厅的预订子集合列表。您不会总是想按餐厅查询您的预订,也许您想按用户或时间等进行拉取。

【讨论】:

  • 感谢您的建议,我会在创建数据库时考虑它们 :)
【解决方案2】:

根据您的评论:

餐厅的管理层应该能够在列表中查看他的预订以及其他客户的其他预订。每个客户也应该能够看到他的预订历史。

我将尝试为您提供一个架构,可以帮助您非常轻松地获取该数据。

Firestore-rrot
   |
   --- users (collection)
   |    |
   |    --- uid (document)
   |    |    |
   |    |    --- type: "manager"
   |    |
   |    --- uid (document)
   |         |
   |         --- type: "client"
   |
   --- reservations (collection)
        |
        --- reservationIdOne (document)
        |       |
        |       --- reservedBy: "uid"
        |       |
        |       --- date: September 21, 2019 at 1:15:02 PM UTC+3
        |
        --- reservationIdTwo (document)
                |
                --- reservedBy: "uid"
                |
                --- date: September 21, 2019 at 1:18:42 PM UTC+3

使用此架构,您可以简单地查询数据库以获取所有用户或特定用户(经理或客户)。您还可以通过在reservations 集合上添加参考来获取所有预订。如果您只想获得单一类型(经理或客户)的预订,您应该使用如下所示的查询:

db.collection("reservations").whereEqual("type", "manager");

如您所见,我还添加了 date 属性,以便您可以轻松地对它们进行降序排序(最后预订优先)。

【讨论】:

  • 这看起来不错,但我又想出了三个更改:首先,我需要将用户分开,因为管理员无法注册自己,所以我必须手动将它们添加到 db,第二,餐厅将制作和发布“折扣”,以便客户可以看到它们,第三,也会有“订单”,因此当客户看到食物折扣时,他可以订购。将这些添加到架构中的最佳方法是什么?
  • 关于您的第一个问题,无需单独添加它们,您可以按照我的回答中的建议将它们添加到单个集合中,然后使用查询区分它们。其次,我希望您能够明白,我无法在您每次对查询有新想法时都重构架构。这就是我从一开始就问您的主要原因,您打算执行哪些查询并且您同意评论中的查询。除此之外,创建另一个餐厅集合并为每个餐厅添加折扣属性将非常简单。
  • 关于第三个问题,你可以用同样的方法解决它,通过创建新的订单集合,一旦用户在特定餐厅创建新订单,使用该特定餐厅中存在的折扣重新开始。
  • 好的,Alex 感谢您抽出宝贵时间回答我的问题。
【解决方案3】:

这实际上取决于您尝试解决的用例,因为您应该针对这些模型上的特定查询进行优化。

我建议观看这些视频以获得更好的想法:

【讨论】:

  • 感谢您的建议,我会看看那些视频!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 2014-12-24
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
相关资源
最近更新 更多