最好的解决方案是什么?
我知道每个人都在寻找最佳解决方案,但在 NoSQL 数据库领域,没有最佳解决方案。您可以通过多种方式为像您这样的应用程序建模数据库并获得相同的结果,我将向您展示原因。在此之前,请看一下我对这个 post 的回答,以更好地理解“完美”、“最佳”或“正确”解决方案的概念,以防万一NoSQL 数据库。
最好的解决方案是,开个玩笑 :) 一个推荐的方法是使用arrays 来实现您正在寻找的这个最喜欢的功能列表。您的数据库架构可能如下所示:
Firestore-root
|
--- users (Collection)
| |
| --- uid (document)
| |
| --- favoriteLocations: ["favoriteLocationId", "favoriteLocationId"]
|
--- locations (Collection)
|
--- locationId (document)
|
--- //Location details
如您所见,favoriteLocations 数组仅包含位置 ID。因此,为了获取位置详细信息,您应该获取这些 id 并进行额外的数据库get() 调用。
另一种方法是存储地图数组或位置对象数组,而不是存储位置 ID 数组。如果您有合理数量的收藏位置(例如 5、10 甚至 50 个但不是 500 个),则此选项可以正常工作。如果您需要存储 500 个位置,您需要存储的原因是什么将某个位置存储为收藏夹?
在这种情况下要记住的重要一点是,文档有限制。因此,在您可以将多少数据放入文档时存在一些限制。根据usage and limits的官方文档:
文档的最大大小:1 MiB(1,048,576 字节)
如您所见,单个文档中的数据总量限制为 1 MiB。当我们谈论存储文本时,您可以存储几乎所有内容,但随着您的数组变得越来越大,请注意这个限制。
如果您想存储单个文档允许存储的更多数据,那么您应该使用集合。这样,您可以在每个用户对象下创建一个子集合,该子集合将作为文档、位置对象保存。你的数据库结构应该是这样的:
Firestore-root
|
--- users (Collection)
| |
| --- uid (document)
| |
| --- favoriteLocations (Collection)
| |
| --- favoriteLocationId (document)
| |
| --- //Location details
|
--- locations (Collection)
|
--- locationId (document)
|
--- //Location details
要查询这样的数据库,请使用以下代码行:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference favoriteLocationsRef = rootRef.collection("users").document(uid).collection(favoriteLocations);
favoriteLocationsRef.get(/* ... */);
另一种方法是将您的数据去特征化并创建您的 favoriteLocations 子集合,作为这样的顶级集合:
Firestore-root
|
--- users (Collection)
| |
| --- uid (document)
| |
| --- //User details
|
--- locations (Collection)
| |
| --- locationId (document)
| |
| --- //Location details
|
--- favoriteLocations (Collection)
|
--- uid (document)
|
--- userFavoriteLocations (collection)
|
--- favoriteLocationId (document)
|
--- //Location details
对应的查询应该是这样的:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference favoriteLocationsRef = rootRef.collection("favoriteLocations").document(uid).collection(userFavoriteLocations);
favoriteLocationsRef.get(/* ... */);
或者更简单的方法是这样的:
Firestore-root
|
--- users (Collection)
| |
| --- uid (document)
| |
| --- //User details
|
--- locations (Collection)
| |
| --- locationId (document)
| |
| --- //Location details
|
--- favoriteLocations (Collection)
|
--- locationId (document)
|
--- uid: "uid"
|
--- //Other location details
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query query = rootRef.collection("favoriteLocations").whereEqualTo("uid", uid);
favoriteLocationsRef.get(/* ... */);
如您所见,我已将用户的 uid 添加为位置对象的属性,因此您可以简单地获取特定用户拥有的所有喜欢的位置。
您可以为您的应用用例选择“最佳”的解决方案:)
PS也请看看我在这个 post 中的回答,我在 Firestore 中详细解释了 collections、maps 和 arrays .