我在Firebase中有一些非规范化实体,如下所示:
projects
-KFsomething
name: "foo"
-KFwhatever
name: "bar"
users
UID-1234
name: "Bob"
UID-5678
name: "Alice"
observations
-KFblah
project: -KFwhatever
user: UID-1234
timestamp: 1234567890
-KFrandom
project: -KFsomething
user: UID-5678
timestamp: 1234567899
与其他孩子一起等等。还有其他具有相似关系的实体。我需要能够在网页上显示用户,项目或其他内容的列表,这些列表按最近的相关观察排序。因此,用户将被分类为Alice然后Bob,因为Alice有更新的观察。同样,项目将被排序为foo然后bar,因为较新的观察属于foo。
如何使用非规范化数据执行此操作?确定排序顺序的参数不属于正在排序的对象。我可以使用数据来简化数据,还是需要一些多步骤的客户端查询?
答案 0 :(得分:2)
在NoSQL中,您通常需要对数据建模以允许您想要使用它的方式。由于您希望通过最近的观察向用户显示,因此您应该为每个用户存储最近观察的时间戳。
projects
-KFsomething
name: "foo"
mostRecentObservationTimestamp: 1234567899
-KFwhatever
name: "bar"
mostRecentObservationTimestamp: 1234567890
users
UID-1234
name: "Bob"
mostRecentObservationTimestamp: 1234567890
UID-5678
name: "Alice"
mostRecentObservationTimestamp: 1234567899
observations
-KFblah
project: -KFwhatever
user: UID-1234
timestamp: 1234567890
-KFrandom
project: -KFsomething
user: UID-5678
timestamp: 1234567899
通过多地点更新,您通常会在发布新观察时写下额外信息:
var observation = {
project: "-KFsomething",
user: "UID-5678"
timestamp: 1234567899
};
var updates = {};
var key = ref.push().key();
updates['observations/'+key] = observation;
updates['users/'+observation.user+'/mostRecentObservationTimestamp'] = observation.timestamp;
updates['projects/'+observation.project+'/mostRecentObservationTimestamp'] = observation.timestamp;
ref.update(updates);
看到这个伟大的blog post on client-side fan-out。