从数据存储到 Firestore 本机的数据模型



我正在尝试迁移一些使用DS的插件来FS,我想知道数据结构。 在我的DS我正在使用ancestors

所以顶级KindUsers,任何其他Kinds都由Users的祖先组成,例如,Products有祖先Key(Users,'UUID')

Firestore世界中,结构会是这样的:

1. Users(Collections):
{userID:...
...
so on},
{...},
...list of users
2. Products(Collections).User-1(Doc)
Subcollections{...list of product docs belonging to User1}
.User-2(Doc)
Subcollections{...list of product docs belonging to User2}

UsersProducts顶级集合。

这种结构会更好:

+ Users (collection)
* user_1 (document)
- name: "Blah"
- last: "Blah"
+ Product (subcollection)
* product_1 (document)
- title: "blah...."
- vendor: "blah..."
+ Product_variants (subcollection)
* product_1 (document)
- name: "..."
- price: "..."
* product_2 (document)
- name: "..."
- price: "..."
* product_2 (document)
- title: "blah...."
- vendor: "blah..."
+ Product_variants (subcollection)
* product_1 (document)
- name: "..."
- price: "..."
* product_2 (document)
- name: "..."
- price: "..."

有没有更好的方法来处理这种结构?从操作更新的角度来看,哪个更简单?我试图了解update与之间的权衡。query.例如,如果我的用户拥有超过100K种产品并获取有关更新/删除/的事件......这种结构是否有缺点。

更新:自 2019 年 5 月起,Cloud Firestore 现在支持集合组查询。

现在,您可以以任一方式构建数据,并且仍然能够跨用户进行查询。

原始答案

如果我理解正确,您是在询问拥有平面集合与子集合的权衡。

就更新而言,没有任何实质性差异。需要注意的一件事是,是否有围绕单个值聚集的字段。例如,对于平面集合,如果产品具有更新时间字段,则默认情况下,所有用户的更新/秒限制为 500 次。对于嵌套在用户中的产品,每个用户每秒只能进行 500 次更新。但是,对于平展集合,您可以通过在更新时禁用默认单字段索引并在 (user, update-time) 上创建复合索引来解决此问题。一旦你这样做了,这些是等效的。

真正的区别在于哪些查询是可能的。在 Firestore 中,您只能在子集合树中进行查询。例如,如果您想搜索来自特定标题或供应商的产品,则只能在单个用户中进行搜索。

如果平展集合,使产品成为顶级集合,则可以跨用户进行查询。

请注意,集合组查询是我们正在开发的一项功能,它将删除此限制。启动后,您将能够以任何一种方式构建数据,并且仍然能够跨用户进行查询。

最新更新