Firebase简单多对多关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Firebase简单多对多关系相关的知识,希望对你有一定的参考价值。

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

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

答案

鉴于列出的要求,您的结构看起来很不错。最重要的是:您已经将数据存储在两个方向上,这是许多新手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

另一答案

你可以这样做:

用户列表

 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

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

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

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

以上是关于Firebase简单多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase 实时数据库中加载/检索多对多关系

如何查询firebase的多对多关系?

查询和改变firebase实时数据库多对多(双向)关系

我可以通过哪些方法正确地在 Firebase Firestore 中的数据结构来建模多对多关系以检索 vue js 中的特定 uid

用于简单数据模型和多对多关系的 Optimal Entity Framework 4 查询

ObjectionJs 获取具有多对多关系的实体