我正在尝试实现Firestore Cloud DB,但我是NoSQL数据库的新手。
我想知道将这些集合排列到集合/文档中的最佳方法是什么:
我有餐厅,有不同的食物和预订。将这些数据集构建到 Firestore DB 中的最佳方法是什么?
这是一种正确的方法吗:
Restaurant1 (Collection)
----> Foods (document)
----> Reservations (document)
我认为将食物和预订存储为顶级集合最终会让您以后获得更多灵活性。
将 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
您会注意到有一些多余的信息。这很好,所以如果你要求所有预订,你会得到餐厅的名字和身份证,等等,你可能想要的东西。你会发现你会想要多次存储数据,这对我来说是一个很好的结构。
使用此结构,您可以非常轻松地调用:
All reservations by user X
或All foods meeting nutrition limits of Y
而不是 collectionGroup 查询,该查询将调用所有餐厅的预订子集合列表。您不会总是想按餐厅查询您的预订,也许您想按用户或时间等进行拉动。
根据您的评论:
餐厅的管理层应该能够在列表中看到他的预订以及其他客户的其他预订。每个客户也应该能够看到他的预订历史。
我将尝试为您提供一个架构,该架构可以帮助您非常轻松地获取该数据。
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
属性,以便您可以轻松地按降序对它们进行排序(首先是最后一次预订(。
这实际上取决于您尝试解决的用例,因为您应该针对这些模型的特定查询进行优化。
我建议观看这些视频以获得更好的想法:
- 什么是NoSQL数据库系列?云恢复是如何构建的?
- 在Firestore NoSQL中对关系数据进行建模
- Firestore 数据建模 - 五种很酷的技术