【问题标题】:How to select locations in Firestore and Android?如何在 Firestore 和 Android 中选择位置?
【发布时间】:2019-04-05 13:51:52
【问题描述】:

我是 Cloud Firestore 的新手,请帮助我。我正在为青少年创建一个应用程序,我想在其中显示每个城市的非常好的位置列表。我还希望每个用户都可以将任何位置保存到最喜欢的部分,以便他或她可以将该位置列表显示给他或她的朋友。

我的实际数据:

  • db -> 用户(所有用户)
  • db -> 位置(所有位置)

我的问题:

我想找到一种方法将用户的位置设置为收藏。我正在考虑在每个用户下创建一个新部分来保存每个喜欢的位置,例如:

  • db -> 用户(所有用户)-> 收藏

我的问题:

如何在一个用户和最喜欢的位置之间建立联系?我认为这是一个(用户)对多的关系。这样做的最佳解决方案是什么?

任何想法或代码将不胜感激!

【问题讨论】:

    标签: firebase database-design google-cloud-firestore


    【解决方案1】:

    最好的解决方案是什么?

    我知道每个人都在寻找最佳解决方案,但在 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 中详细解释了 collectionsmapsarrays .

    【讨论】:

    • 没想到会有这样的答案。我想我会使用第一个解决方案。谢谢亚历克斯!
    • 您也可以等待其他答案,但如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我会很感激的。谢谢!
    猜你喜欢
    • 2018-07-06
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多