【问题标题】:Can my FireBase database layout cause issues if I use this approach?如果我使用这种方法,我的 FireBase 数据库布局会导致问题吗?
【发布时间】:2016-10-27 01:23:00
【问题描述】:

我有一个看起来像这样的 FireBase 结构。我想代表世界上所有国家。

在这个示例代码中只有 9 个国家,只有美国和委内瑞拉有数据来证明我的问题。

我进行了非规范化并尽可能地展平数据。

她发生的事情是用户可以搜索街道地址,例如

US/California/Orange County/Orange/3138 E Maple Ave    

在下面的数据库中,它看起来像这样:

US/ADMINISTRATIVE_AREA_LEVEL_1/    
US/ADMINISTRATIVE_AREA_LEVEL_2    
US/LOCALITY    
US/STREET_ADDRESS    

  ....
  ....
  "AE": {
    "name": "United Arab Emirates"
  },
  "GB": {
    "name": "United Kingdom"
  },
  "US": {
    "name": "United States"
    "ADMINISTRATIVE_AREA_LEVEL_1": {
      "hjg86tghg8hubyhiuhb88ihi": {
        "level1": "California"
      },

    },
    "ADMINISTRATIVE_AREA_LEVEL_2": {
      "hjg86tghg8hubyhiuhb88ihi": {
        "level2": "Orange County"
      },
    },
    "LOCALITY": {
      "hjg86tghg8hubyhiuhb88ihi": {
        "level2": "Orange"
      },
    },
    "STREET_ADDRESS": {
      "hjg86tghg8hubyhiuhb88ihi": {
        "3138 E Maple Ave": {
        }
      }
    },
    "USER_LIST": {
      "hjg86tghg8hubyhiuhb88ihi": {
        "name": "Jhon Doe",
      }
    },
    "CHAT_LIST": {
      "hjg86tghg8hubyhiuhb88ihi": {
        "title": "Wam-Bam-CHAT",
      }
    },
    "chat_members": {
      "hjg86tghg8hubyhiuhb88ihi": {
      }
    },
    "chat_messages": {
      "hjg86tghg8hubyhiuhb88ihi": {
    },
  },
  "UM": {
    "name": "United States Minor Outlying Islands"
  },
  "UY": {
    "name": "Uruguay"
  },
  "UZ": {
    "name": "Uzbekistan"
  },
  "VU": {
    "name": "Vanuate"
  },
  "VE": {
    "name": "Venezuela"
       "ADMINISTRATIVE_AREA_LEVEL_1": {
      "swdkewsjdr34378943489324": {
        "level1": "California"
      },

    },
    "ADMINISTRATIVE_AREA_LEVEL_2": {
      "swdkewsjdr34378943489324": {
        "level2": "Orange County"
      },
    },
    "LOCALITY": {
      "swdkewsjdr34378943489324": {
        "level2": "Orange"
      },
    },
    "STREET_ADDRESS": {
      "swdkewsjdr34378943489324": {
        "3138 E Maple Ave": {
        }
      }
    },
    "USER_LIST": {
      "swdkewsjdr34378943489324": {
        "name": "Jhon Doe",
      }
    },
    "CHAT_LIST": {
      "swdkewsjdr34378943489324": {
        "title": "Wam-Bam-CHAT",
      }
    },
    "chat_members": {
      "swdkewsjdr34378943489324": {
      }
    },
    "chat_messages": {
      "swdkewsjdr34378943489324": {
    },
  },
  "VN": {
    "name": "Viet Nam"
    ....
    ....

当我创建这样的实时数据库规则时:我必须创建 240 个根节点,因为 240 个国家/地区对。 有一大堆".read": "$uid === auth.uid" 和一大堆重复的json,因为所有ADMINISTRATIVE_AREA_LEVEL_1 和其他看起来都一样。 如果我将ADMINISTRATIVE_AREA_LEVEL_1 作为根,我可能会有数百万个条目,而对于 STREET_ADDRESS,仅美国就有 1.54 亿,更不用说“世界”了。所以我像这样对它们进行分组,将 Country 作为关键根节点。

小样本:

{
  "rules": {
    "SE": {
      "ADMINISTRATIVE_AREA_LEVEL_1": {
        "$uid": {
          ".read": "$uid === auth.uid",
          ".write": "$uid === auth.uid"
        }
      }
    },
    "VE": {
      "ADMINISTRATIVE_AREA_LEVEL_1": {
        "$uid": {
          ".read": "$uid === auth.uid",
          ".write": "$uid === auth.uid"
        }
      }
    }
  }
}

我的问题是如何进一步提高效率以及我可以期待哪些瓶颈。有没有办法拥有这种结构并集中设置规则而无需在所有位置显式编写它

更新 可能我弄错了,但无论如何,在@FrankvanPuffelen 回答之后,我尝试了这个:必须测试运行这个,但是这在我上面的代码中的所有 240 个国家/地区都有效..

{
  "rules": {
    "$country": {
      "ADMINISTRATIVE_AREA_LEVEL_1": {
        "$uid": {
          ".read": "$uid === auth.uid",
          ".write": "$uid === auth.uid"
        }
      },
      "ADMINISTRATIVE_AREA_LEVEL_2": {
        "$uid": {
          ".read": "$uid === auth.uid",
          ".write": "$uid === auth.uid"
        }
      },
      "LOCALITY": {
        "$uid": {
          ".read": "$uid === auth.uid",
          ".write": "$uid === auth.uid"
        }
      },
....and more
    }
  }
}

更新 是的,它只需要一点时间就可以工作

{
  "rules": {
    "$hubaBuba": {
      "ADMINISTRATIVE_AREA_LEVEL_1": {
         ".read": "auth != null",
         ".write": "auth != null",
      },
      "ADMINISTRATIVE_AREA_LEVEL_2": {
           ".read": "auth != null",
           ".write": "auth != null",
      },
      "LOCALITY": {
        "$uid": {
          ".read": "$uid === auth.uid",
          ".write": "$uid === auth.uid"
        }
      },
....and more
    }
  }

【问题讨论】:

    标签: firebase-realtime-database firebase-security


    【解决方案1】:

    如果每个国家/地区的规则相同,您可以使用通配符来表示国家/地区:

    {
      "rules": {
        "$country": {
          "ADMINISTRATIVE_AREA_LEVEL_1": {
            "$uid": {
              ".read": "$uid === auth.uid",
              ".write": "$uid === auth.uid"
            }
          }
        }
      }
    }
    

    【讨论】:

    • 我知道 $uid 是当前用户,但这是否意味着具有路径的当前用户:$country/ADMINISTRATIVE_AREA_LEVEL_1/ 可以是 US/ADMI..SE/ADMI.. 或任何国家...数据库知道,如何? ....需要一些习惯这种抽象思维:)
    猜你喜欢
    • 2023-03-28
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多