Firebase简单多对多关系

问题描述 投票:0回答:2

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

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

  • 获取事件的用户列表,了解它的id和城市
  • 获取知道它的id和城市的用户的事件列表
  • 添加或删除有关用户参加活动的信息

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

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}
           },
}

使用和维护是否容易和快速?

firebase firebase-realtime-database nosql
2个回答
1
投票

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

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

  1. 确保将数据存储为映射,而不是数组。所以event_id_1 : {'user_1': true, 'user_2': true }
  2. 如果用户和事件之间存在多对多的关系,我通常会有四个顶级列表:usersevents(关于每个的主要信息),然后是userEventseventUsers(用于两者之间的连接) 。

将用户添加到事件可以通过单个多位置更新来完成,例如:

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


1
投票

你可以这样做:

用户列表

 Users
  useruid 
    name:userx
    email:[email protected]
  useruid
     name:usery
     email:[email protected]

  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

获取知道其ID和城市的用户的事件列表:

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

使用监听器,这可以为您提供location:city1中的事件

© www.soinside.com 2019 - 2024. All rights reserved.