Firebase简单多对多关系

时间:2018-03-06 11:59:02

标签: firebase firebase-realtime-database nosql

我对NoSQL和Firebase实时数据库有点熟悉,而且我知道它不是解决关系数据库应该更合适的任务的最佳解决方案。我想验证一下我所拥有的简单多对多关系的结构。

我有活动和用户。我想使用Firebase存储有关参与活动的用户的信息,稍后我需要

  • 获取用户参加活动的列表了解其ID和城市
  • 获取用户事件列表了解其ID和城市
  • 添加或删除有关参与活动的用户的信息

我希望第一棵事件ID被城市划分。

events {
'city1' : {
           event_id_1 : {'user_1', 'user_2'},
           event_id_2 : {'user_3', 'user_4'}. 
           }
'city2' : {
           event_id_3 : {'user_5', 'user_6'},
           event_id_4 : {'user_7', 'user_7'}. 
           }
}

用户的第二棵树

users {
'user1' : {
           'city1' : {event_id_1, event_id_2}, 
           'city2' : {event_id_3, event_id_4},
           'city3' : {event_id_3, event_id_4}
           }, 
'user2' : {
           'city1' : {event_id_1, event_id_2}, 
           'city2' : {event_id_3, event_id_4},
           'city3' : {event_id_3, event_id_4}
           },
'user3' : {
           'city1' : {event_id_1, event_id_2}, 
           'city2' : {event_id_3, event_id_4},
           'city3' : {event_id_3, event_id_4}
           },
}

使用和维护是否简单快捷?

2 个答案:

答案 0 :(得分:1)

你可以这样做:

用户列表

 Users
  useruid 
    name:userx
    email:userx@gmail.com
  useruid
     name:usery
     email:usery@gmail.com

  Events
    eventid
       useruid
         name:userx
         location: city1
         eventname: party
    eventid2
       useruid1
          name:usery
          location: city2
          eventname: Boring Party

获取知道其身份和城市的活动的用户列表:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Events").child(eventid);
ref.orderByChild("location").equalTo(city1);

//retrieve users using a listener

获取知道其身份和城市的用户的活动列表:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Events");
Query q=ref.orderByChild("location").equalTo(city1);

使用侦听器,可以为您提供location:city1

中的事件

答案 1 :(得分:1)

根据列出的要求,您的结构看起来很不错。最重要的是:您已经将数据存储在两个方向上,这是许多新手NoSQL数据建模的最大障碍。

关于您的数据模型的一些注释,尽管大多数都是在拼写错误的级别:

  1. 确保将数据存储为地图,而不是数组。所以event_id_1 : {'user_1': true, 'user_2': true }
  2. 如果用户与活动之间存在多对多关系,我通常会有四个顶级列表:usersevents(有关每个列表的主要信息) ,然后userEventseventUsers(两者之间的连接)。
  3. 可以使用单个多位置更新来添加用户到事件,例如:

    ref.update({
      '/userEvents/userId1/eventId1': true,
      '/eventUsers/eventId1/userId1': true
    });
    

    取消注册它们就像使用null作为值(删除现有密钥)一样:

    ref.update({
      '/userEvents/userId1/eventId1': null,
      '/eventUsers/eventId1/userId1': null
    });
    

    另请参阅我的答案:Many to Many relationship in Firebase