我的问题与this clarification question about denormalization非常相似,但我想稍微改变一下情况。
在this blog post on denormalization的注意事项部分中,Firebase用户会说以下有关更新数据的内容。
让我们讨论[非规范化数据结构]的一些后果。您需要确保每次创建一些数据(在本例中为注释)时,它都会放在正确的位置。
该示例包括三个路径,一个用于存储注释的数据,另一个用于存储指向该注释的指针。
...
评论的修改很简单:只需将/ comments下的评论值设置为新内容即可。要删除,只需删除/ comments中的注释 - 当您在代码中的其他地方遇到注释ID时,/ comments中不存在注释ID,您可以认为它已被删除并正常进行:
但这只有效,因为正如另一个问题的答案所说,
博客文章中详述的结构不存储重复的注释。我们会在
/comments
下存储一次评论,然后将这些评论的名称存储在/links
和/users
下。这些函数用作指向实际注释数据的指针。
基本上,内容只存储在一个位置。
如果情况需要存储重复数据怎么办?在这种情况下,推荐的更新数据的方法是什么?
An answer to this question exists,但它是针对MongoDB的,我不确定它是否解决了Firebase中的问题。
我能想到的最明智的方法,仅供参考,如下。
我有一个帮助器类,我在Firebase中提供了一个路径目录,这有点类似于一个模式。此类具有包装Firebase方法的方法,以便我可以在我的模式指定的所有路径下执行写入和更新。辅助类迭代每个存在对象引用的路径,并在每个位置执行写入,更新或删除。在我的情况下,对于任何单独的操作,存在不超过4个路径,并且大多数具有2个。
想象一下,我有三个顶级键,用户,事件和事件 - 元数据。用户将图像发布到事件,事件和用户都拥有所有图像的嵌套记录。事件 - 元数据是我自己想要在页面上显示一堆事件的情况下的顶级键,但我不想随意删除数百个图像记录。
图片可以有字幕,因此,在更新图片的标题时,我应该更新这些路径:
new Firebase("path/to/eventID/images/imageID/caption")
,
和
new Firebase("path/to/userID/images/imageID/caption")
我给我的助手类这些路径和一个包装器方法,所以无论何时更新标题,我都可以调用helperclass.updateCaption(imageObj,newCaptionData),并迭代地更新每条路径上的数据。
图像与包含eventID,userID和imageID的属性一起存储,以便可以正确填充这些路径的骨架。
这是解决此问题的推荐和/或适当方式吗?我做错了吗?