Firebase双向关系/检索数据

时间:2016-07-31 09:25:06

标签: javascript firebase firebase-realtime-database

我想对firebase中的数据检索做一些解释。我不是NoSql数据结构的专家,我脑子里想不到什么。这对我来说并不自然。但是,我认为我已经理解了这种结构中双向关系的基础知识。

这是我的数据结构:

{
// Two-way relationships between accounts & logements
  "accounts" : {
    "uniqueId1" : {
      "nom" : 'My name 1',
      "email" : 'My email 1',
      "logements" : {
          uniqueIdLogement1 : true,
          // do I have to list relationships with images & geofire here ?
          uniqueIdLogement2 : true
      },
      "favorites" : {
          uniqueIdLogement2 : true,
          uniqueIdLogement25 : true,
          uniqueIdLogement32 : true
      }

    },
    ....
  },
  // Each logement has his own "images" & "geofire" data
  "logements" : {
    "uniqueIdLogement1" : {
      "nom_du_logement" : 'My logement name 1',
      "accounts" : {
          uniqueId1 : true
      },
      "images" : {
          uniqueIdImages1 : true,
          uniqueIdImages2 : true,
          uniqueIdImages3 : true,
      },
      "geofire" : {
          uniqueIdGeofire1 : true
      },
    },
    ...
  },
  "images" : {
    "uniqueIdImages1" : {
      "image" : 'My image URL 1',
      "logements" : {
          uniqueIdLogement1 : true
      }
    },
    ...
  },
  "geofire" : {
    "uniqueIdGeofire1" : {
      "g" : 'My geofire Data,
      "l" : {
          0 : '-44.34',
          1 : '-3.2'
      },
      "logements" : {
          uniqueIdLogement1 : true
      }
    },
    ...
  }
}

我认为每个人都有自己对数据结构的看法,但在我看来(参考Firebase文档)它必须非常类似。但如果您看到一些更新,请不要犹豫!

所以,在angularJs中,我想列出每个" logements"对于" uniqueId1"例如,展示他们自己的"图像" &安培;地理位置数据(并检查它们是否是我的用户最喜爱的物品)。
是否可以这样做?

// list every logements for account ID1
    // for each logement take images data & geofire data & check if favorites
        // push infos in $scope.items & display with ng-repeat

另一个与此相关的问题:当我删除" logements"对于用户ID1,我想删除所有图像& geofire参考......!是否也可以这样做?

// remove uniqueIdLogement1 from account ID 1
   // remove images where "logements" = uniqueIdLogement1
   // remove goofier where "logements" = uniqueIdLogement1

我认为,如果我理解正确,那对我来说没问题!我现在无法看到它是如何工作的,令人沮丧,因为我知道这种数据库有很大的潜力。你能解释一下我的一些细节吗?非常感谢你

1 个答案:

答案 0 :(得分:1)

对于任何数据库,您经常需要从多个位置加入数据来构建视图。

在关系数据库中,您可以使用JOIN子句通过单个语句从这些多个位置(在该情况下为表)中获取数据。

在Firebase(以及许多其他NoSQL数据库)中,没有内置方法可以从多个位置连接数据。因此,您必须在代码中执行此操作。

var ref = firebase.database().ref();
var accountRef = ref.child('accounts/uniqueId1');
accountRef.on('value', function(accountSnapshot) {
  var logementCount = accountSnapshot.child('logements').numChildren;
  var logementLoadedCount = 0;
  accountSnapshot.child('logements').forEach(function(logementKey) {
    var logementRef = ref.child('logements').child(logementKey.key);
    logementRef.once('value', function(logementSnapshot) {
      var logement = logementSnapshot.val();
      logementLoadedCount = logementLoadedCount + 1;
      if (logementLoadedCount == logementCount) {
        console.log('We've loaded all logements');
      }
    });
  });
});

来自SQL和传统Web开发背景的许多开发人员都担心所有嵌套调用的性能。在Firebase中不需要(对于合理数量的数据),因为Firebase会通过单个连接对请求进行管道传输。请参阅Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly

总的来说,我强烈建议您阅读NoSQL data modeling上的这篇文章,以便对一般主题做一个很好的介绍。