代码之家  ›  专栏  ›  技术社区  ›  Red M

如何使我的NoSQL模型结构比它更平坦(FireBase实时数据库)

  •  0
  • Red M  · 技术社区  · 7 年前

    我正试图建立一个数据库结构模型来检索特定城市中的餐厅。

    例如:
    当用户接受共享其位置时,我将使用该用户的地址对象来检索该特定位置内的餐厅。我试图只检索那个特定城市的餐馆,而不检索其他国家的餐馆,因为这只会花费更多的时间,而且用户不需要这些数据,换句话说,这只会增加时间复杂性。

    我目前使用的是FireBase实时数据库,它是一个NoSQL JSON数据库。
    开发这种结构的最佳实践是什么?

    到目前为止,我考虑过创建这样一个结构,例如:

    国家

    --> France = {Paris, Lyon, Nantes},   
    -->Australia = {Sydney, Melbourne},   
    -->India = {Mumbai, New Delhi},   
    -->Canada = {Toronto, Ottawa, Montreal, Victoria},   
    -->Et cetera
    

    在每个城市里,我都会有我的餐馆名单
    例如:

    Paris --> {Le ciel de paris, le cinq, Savoy}. 
    

    这看起来有点像我的套套,我正试着跟随 Firebase Realtime Database documentation 但是我想不出任何其他方法来扁平我的数据。

    问题:
    有没有办法让我的模型结构更扁平,这样检索数据就不麻烦了?

    *我是一个NoSQL新手,帮助我会很感激的。*

    2 回复  |  直到 7 年前
        1
  •  1
  •   Alex Mamo    7 年前

    我对您的数据库结构的建议是使用一个节点,您可以在其中添加相应国家/地区下的所有城市,并应如下所示:

    Firebase-root
       |
       --- countries
             |
             --- France
                   |
                   --- restaurantIdOne
                   |      |
                   |      --- city: "Paris"
                   |      |
                   |      --- //other restaurant details
                   |
                   --- restaurantIdTwo
                          |
                          --- city: "Lyon"
                          |
                          --- //other restaurant details
    

    使用此数据库结构,您可以轻松地查询数据库,以获取属于特定国家/城市的所有Restarant。例如,假设您想要在法国/巴黎购买所有的餐厅。要实现这一点,您需要使用如下所示的查询:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    Query query = rootRef.child("countries").child("France").orderByChild("city").equalTo("Paris");
    
        2
  •  0
  •   Neel Rao    7 年前

    我认为你拥有的很好,但这取决于你存储了多少餐馆和餐馆数据。例如,如果您的用户界面首先显示餐厅列表,然后在查看餐厅后显示一系列元数据,那么您可能需要如下内容:

    {
      restaurants: {
        country1: {
          city1: {
            restaurant1: {
              title: 
              cuisine:
            },
            restaurant2: {
              title:
              cuisine:
            }
          }
        }
      }
      restaurantData: {
        restaurant1: {
          comments: {
            ...
          }
          pictures: {
            ...
          }
        }
      }
    }
    

    这样,当您的用户界面显示餐厅列表时,您就不必下载大量可能不需要的额外数据。

    推荐文章