2016-10-24 3 views
0

私はこのようなFireBase構造を持っています。私は世界のすべての国を代表したい。この方法を使用するとFireBaseデータベースのレイアウトに問題が生じる可能性がありますか?

このサンプルコードでは、9カ国のみがあり、米国とベネズエラのみが問題を示すデータを持っています。

私は非正規化を行い、可能な限りデータを平坦化します。

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" 
    .... 
    .... 

私はリアルタイムのデータベースルールを作成するには、この好き:何が起こる

は、彼女はそれがこのようになりますの下に、ユーザーがDBに

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

のように住所を検索することができるということです私は240カ国のために240の根本的な頷きを作成しなければなりません。 全部ADMINISTRATIVE_AREA_LEVEL_1などが同じように見えるので、".read": "$uid === auth.uid"の戦利品と重複するjsonの戦利品があります。 もし私がADMINISTRATIVE_AREA_LEVEL_1をルートとして置くと、私は多分エントリのmiljonsを持っているでしょうし、STREET_ADDRESSのためには、「世界」について語らないために米国だけで1億5400万人があります。だから私はそれらを国の主要ルートノードとしてグループ化します。

小さなサンプル:

{ 
    "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" 
     } 
     } 
    } 
    } 
} 

私の質問は、私はさらにこれをより効率的にすることができ、どのようなボトルネック(s)は私が期待できる方法です。明示的にすべての場所で

UPDATE それを記述することなく、このような構造を持っており、中央にルールを設定することが方法は、おそらく私はこの誤解しますが、とにかくここに、@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 
    } 
    } 
} 

UPDATEを行い はい、それは少しtweek

{ 
    "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 
    } 
    } 
で動作します

答えて

0

各国のルールが同じであれば、あなたが国のためにワイルドカードを使用することができます。

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

私は、$ uidが現在のユーザーであることを理解しますが、これはパスを持っている現在のユーザーのことを意味しています: '$ country/ADMINISTRATIVE_AREA_LEVEL_1 /'は 'US/ADMI..'または' SE/ADMI..'または任意の国...とすることができ、Databasはどのように知っていますか? ....この抽象化思考にいくつかの使用を取得:) –

関連する問題