json - 在 Firebase 中复制数据的正确方法是什么?
问题描述
我最近一直在重构我的代码,以尝试对我的 Firebase 数据库进行非规范化。我知道一些重复和冗余是必要的,但我发现很难确定正确的重复水平。
例如,在我的项目中,我有outfits
and items
,其中 anoutfit
可能有很多items
标签。
目前,我有这个设置:
outfits
outfitId
outfitName
outfitDescription
items
itemId
itemName
itemDescription
itemBrand
itemsByOutfit
outfitId
itemId
itemName
itemDescription
itemBrand
itemId
itemName
itemDescription
itemBrand
在 UI 中,我经常需要获取outfit
对象列表以及标记的项目。 itemsByOutfit
在这个意义上是一个方便的索引 - 因为我可以一次获得名称、描述和品牌。
但是当涉及到重命名项目或更改描述时,我也必须扇出更新。
itemsByOutfit
将其限制在itemId
价值上会更好吗?像这样:
itemsByOutfit
itemId: true
itemId: true
这似乎更易于维护,但在获取时需要更多工作。我大概必须使用所有itemId
值进行第二次查询以获取名称、品牌等。
我还有另一个索引——itemsByBrand
它遵循类似的复制模式。所有数据均按品牌复制和组织 - 例如:
itemsByBrand
Nike
itemId
itemName
itemDescription
itemBrand
我将不胜感激任何可能帮助我构建更具可扩展性的解决方案的想法或最佳实践。谢谢!
解决方案
我的观点是你只持有一次项目数据(名称、描述、品牌),即。在项目节点中。所有其他 itemby'x' 列表都是 itemId:bool 列表,您读取这些列表以获取必要的项目,然后遍历返回的列表以检索项目数据。不应该有太多的性能开销,并且涉及的数据量很小。
推荐阅读
- android - 如果将多张图片插入多张图片视图
- c - 使用 MASM 生成对象文件并将它们与 MSVC 对象文件链接
- mysql - AWS Aurora 仅在登录失败时将换行记录到错误日志中
- google-sheets - 谷歌表格 - 如果与其他行相同则计数
- sql - 删除 SQL Server 中的重复记录
- javascript - 从数组中删除所选项目
- c++ - 在 C++20 中从有符号整数到无符号整数,反之亦然
- java - gson get 方法的 java.lang.StackOverflowError
- node.js - 为什么 mongodb 聚合 $match 没有返回预期结果?
- android - Flutter with Redux:如何显示来自中间件的警报?我在哪里可以获得 BuildContext