假设我有以下结构,我想运行一个查询来显示照片列表/他们的作者照片和名称。构建和查询这个的最佳方法是什么?
一方面,我不喜欢在每张照片下复制数据(user.name和user.photoUrl)。另一方面,我认为没有干净的方法可以在照片查询中包含完整用户,或者根据ID列表获取用户列表(基本上是IN语句)?
users
user1
name: "A"
photoUrl: "LINK"
user2
name: "B"
photoUrl: "LINK"
photos
photo1
author: user1
photoUrl: "Link"
likesCount: 120
答案 0 :(得分:0)
NoSQL系统中的数据复制非常普遍 - 磁盘空间很便宜。但是,如果操作不当,可能会使问题复杂化并“将您编入角落”:更新数据集需要对数据库进行多次更新。
解决方案的一些选项是
1) Duplicate Data
2) Nest queries
3) Simplify
1)重复数据:这是相当明显的,并在您的问题中提到,将用户信息添加到每张照片。不要避免这种解决方案,因为它往往是可行的方式。
2)Nest查询:非常简单:将所有照片节点加载到一个数组中,然后迭代数组并加载每个作者。这也很常见,但您必须考虑Firebase的异步特性,并确保在功能关闭完成之前不使用数据。
3)简化你的结构:你的例子中显示你有一对多的关系。
每位作者/用户都有多张照片,因此保持简单,与作者一起存储照片数据。
user_0
name: "A"
photos
photo_0
url: "asdasd"
likes: 123
photo_1
url: "fghfhf"
likes: 42
user_1
name: "B"
photos
photo_0
url: "qqqqqq"
likes: 12
photo_1
url: "wwww"
likes: 16
我关于Denormalizing data - 我越是越好越好。但是,这一切都取决于用例,因此不是必需的,在这种情况下,根据问题中的数据,简化可能是最佳解决方案。