2014-04-17 51 views
4

以下是該場景:我有一個主題列表;每個主題包括帖子;並且每個帖子都被用戶列表「喜歡」。因此,我的數據看起來是這樣的:如何連接Firebase中深度達兩級以上的非規範化數據

"topics": { 
    "topic1": { 
     "posts": { 
      "post1": true, 
      "post2": true 
     } 
    } 
}, 
"posts": { 
    "post1": { 
     "title": "An awesome post", 
     "likes": { 
      "user1": true 
     } 
    }, 
    "post2": { 
     "title": "An even better post", 
     "likes": { 
      "user1": true, 
      "user2": true 
     } 
    } 
}, 
"users": { 
    "user1": { 
     "name": "Mr. T", 
     "email": "[email protected]" 
    }, 
    "user2": { 
     "name": "Mr. Hello World", 
     "email": "[email protected]" 
    } 
} 

我(我想)知道如何使用Firebase.util(http://firebase.github.io/firebase-util),以獲得該主題的所有帖子:

Firebase.util.intersection(
    fb.child('topics').child('topic1').child('posts'), 
    fb.child('posts') 
) 

但現在我想每個發佈以包括喜歡該帖子的用戶的姓名。如何做到這一點?

可能不會改變任何東西,但這一切都發生在AngularFire中。

+0

侯沒問你要查詢的內容。這是一個用戶喜歡的帖子嗎?還是喜歡在一個主題中發帖的所有用戶? – webduvet

+0

抱歉不清楚。在這種情況下,我希望看到喜歡帖子的用戶的所有姓名。所以如果你在看帖子/帖子2,我想看到「喜歡T先生和Hello World先生!」 – Jake

+1

因此,不要使用「true」作爲喜歡的值,您可以使用他的名字 – webduvet

回答

3

See working example here

這種非規範化的要點是,你抓的帖子來獲取用戶。這聽起來並不複雜。只要去抓住他們。

火力地堡做了很多工作,在內部優化的要求,並重新使用的所有偵聽同一個套接字連接,所以這是非常高性能 - 幾乎沒有更多的開銷不是字節的數量被下載,而不管他們是否是分成不同的路徑或一起存儲。

的HTML:

<h3>Normalizing user profiles into posts</h3> 

<ul ng-controller="ctrl"> 
    <li ng-repeat="post in posts | orderByPriority" ng-init="user = users.$load(post.user)"> 
     {{user.name}}: {{post.title}} 
    </li> 
</ul> 

中的JavaScript:

var app = angular.module('app', ['firebase']); 
var fb = new Firebase(URL); 

app.controller('ctrl', function ($scope, $firebase, userCache) { 
    $scope.posts = $firebase(fb.child('posts')); 
    $scope.users = userCache(fb.child('users')); 
}); 

app.factory('userCache', function ($firebase) { 
    return function (ref) { 
     var cachedUsers = {}; 
     cachedUsers.$load = function (id) { 
      if(!cachedUsers.hasOwnProperty(id)) { 
       cachedUsers[id] = $firebase(ref.child(id)); 
      } 
      return cachedUsers[id]; 
     }; 
     cachedUsers.$dispose = function() { 
      angular.forEach(cachedUsers, function (user) { 
       user.$off(); 
      }); 
     }; 
     return cachedUsers; 
    } 
}); 
+0

謝謝加藤。這太棒了。儘管Firebase提高了所有功能,但如果數據更加完全非規範化(即所有用戶信息都已複製)或性能基本相同,那麼它仍會更具性能嗎? – Jake

+0

當然,更少的請求會更快,至少在最初。但與大多數情況一樣,除非出現實際問題,否則不應該打擾優化。正如你可以在小提琴中看到的那樣,它太快了,甚至沒有注意到它會進行三次往返。在幾百條記錄中,它可能是顯而易見的,但可能還是相當高效的。 – Kato