我想尝试NoSql
并在Firebase
开始我的项目。我的应用程序数据增加了很多。但是,现在我需要运行特定于国家/地区的应用,因此根据我的应用中的国家/地区显示/过滤数据。
我当前数据的结构如下。
{ clients: {
"04E2LBixKoVn9sGzRvxtMoC7MsF3" : {
"clientName" : "Rising Mall",
"contact" : {
"branches" : {
"-Kx6QoVhr0WpDQ3i68_n" : {
"address" : "Test Location",
"phone" : "999999999",
"country": "USA"
}
},
"mail" : "test@test.edu.np",
"website" : "http://www.test.np"
},
"description" : "Test Description."}
},
"073ezb0UsgetSef0lwk50dhogjM2" : {
"clientName" : "Leather Craft",
"contact" : {
"branches" : {
"-Kx6QoVj_QKM7tjekh_1" : {
"address" : "Test Location",
"phone" : "888888888"
"country": "UK"
}
},
"mail" : "test@test.com",
"website" : "https://www.test.com"
},
"description" : "Test"
}
}
从上面的结构中,我想得到一个国家/地区所有客户的列表" USA"。如何通过在Android中查询FirebaseDatabase
来直接执行此操作?可能吗?或者我是否必须完全更改数据库的结构?如果我必须重构我的数据库,也建议一个解决方案。
更新
我接受了@ alex-mamo给出的建议,并通过对数据进行非规范化来设计我的所有结构。
Firebase-root
|
--- usClients
|
--- usClientId1 : true
|
--- usClientId2 : true
答案 0 :(得分:1)
要实现这一点,您不需要完全重构数据库,只需稍微更改一下即可。要解决此问题,您需要将另一个节点添加到名为usClients
的数据库中。每次添加来自USA的新用户时,也要在此新创建的节点中添加它。您的新节点应如下所示:
Firebase-root
|
--- usClients
|
--- usClientId1 : true
|
--- usClientId2 : true
使用此结构,您可以查询数据库以仅获取美国境内的客户。这可以在usClients
节点上附加侦听器并在DataSnapshot
对象上进行迭代。
这种做法称为非规范化,是Firebase的常见做法。为了更好地理解,我重新命令您看到此视频,Denormalization is normal with the Firebase Database。