我们已经处理了这个问题很多次,表面上看起来像使用电子邮件作为一个关键是一个简单的解决方案,它导致了很多其他问题:必须清理/解析电子邮件,以便它实际上可以使用。如果电子邮件更改会怎样?
我们发现改变数据存储方式是一条更好的路径。假设你只需要存储一个东西,即用户名。
[email protected]: "John Smith"
其改为
randomly_generated_node_name
email: "[email protected]"
first: "John"
last: "Smith"
的randomly_generated_node_name是火力地堡可以通过childByAutoId产生,或真不直接绑定到数据的任何类型的参考的字符串。
这提供了很大的灵活性:你现在可以改变人的姓氏 - 比方说他们结婚了。或更改他们的电子邮件您可以添加可用于排序的'index'子元素0,1,2等。可以查询任何儿童数据的数据。所有这些都是因为random_generated_node_name是对节点内变量子数据的静态引用。
它还允许您在未改变现有数据的情况下在未来扩展数据。添加地址,喜爱的食物,排序等
编辑索引:用于电子邮件火力地堡查询在ObjC:
//references all of the users ordered by email
FQuery *allUsers = [myUsersRef queryOrderedByChild:@"email"];
//ref the user with this email
FQuery *thisSpecificUser = [allUsers queryEqualToValue:@“[email protected]”];
//load the user with this email
[thisSpecificUser observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) {
//do something with this user
}];
来源
2015-08-09 12:37:39
Jay
谢谢杰伊。我应该指定更好的。我保存的数据就像你在主/用户数据库中建议的那样。作为密钥的电子邮件用于索引查找。所以我的index/users/email/'[email protected]'被设置为实际的用户ID。也许我会考虑更多的思考如何通过一个arraylike格式索引 – irth
是的 - 这只是导致各种编码问题。最好不要使用实际的电子邮件(或任何可能会改变的数据)作为关键。您可能只想为每个用户节点添加一个索引子节点:index:“0”,index:“1”等等。这样你就可以获得类似数组的行为,而不必实际使用数组(这通常是一个坏主意),并且可以通过名称,电子邮件或索引来查询特定用户。 – Jay
啊,也许我还没有看到它,但是我不需要遍历所有的用户,直到找到我正在查找的电子邮件。我在索引中使用电子邮件作为关键字,以便直接查找并理解属性更改时所需的额外代码。我困惑吗? – irth