【发布时间】:2019-02-25 23:08:11
【问题描述】:
简介
我有一个类似于社交媒体数据库的 FireStore 数据库,其中包含 3 个集合用户、事件和事件更新。我的目标是使用我和我的朋友创建的 eventUpdates 创建一个提要。所以我必须用友谊连接来扩展我的数据库。但是我在 3 个问题上苦苦挣扎,希望这里有人可以推动我朝着正确的方向解决这些问题。
问题/问题 1:
我在 EventUpdate 模型中添加了用户名和用户图像,以便于查询。我听说非规范化是进入 NoSQL 数据库的方式。但是如果用户更新他的用户图像,我必须更新该用户创建的所有 eventUpdates。听起来像是你不想做的事情。但是有没有更好的方法来做到这一点?
问题/问题 2:
如何创建针对执行以下查询而优化的数据结构:从我和我的朋友那里获取 eventUpdates,按日期排序。
问题/问题 3:
如何存储喜欢?我可以在 eventUpdate 中保留一个计数器。但是,当我对 eventUpdates 进行非规范化时,这会成为一个问题(请参阅 EDIT 下面的当前解决方案)..
数据结构示例 .
{
"users": {
"1": { "name": "Jack", "imageUrl": "http://lorempixel.nl" }
},
"events": {
"A": {
"name": "BeerFestival",
"date": "2018/09/05",
"creatorId": "1"
}
},
"eventUpdates": {
"1": {
"timestamp": "13243543",
"creatorId: "1",
"creatorName": "Jack",
"creatorImageUrl": "http://lorempixel.nl",
"eventId": "A",
"message": "Lorem ipsum"
}
}
}
编辑
好的,经过反复试验,我最终得到了以下结构。这种结构似乎可行,但我对这个解决方案的问题是,由于每个提要中的所有副本(1000 个关注者意味着 1000 个副本),我需要进行大量写入调用来更新单个 eventUpdate。看起来我需要做很多事情。
例如,我想为每个事件更新添加一个赞按钮。这会触发所有 EventUpdate 副本的更新。对我来说,firebase 似乎不适合我的项目,我正在考虑用 SQL DB 替换它,或者这里的任何人都可以用更好的解决方案改变我的想法吗?
{
"users": {
"user1": { "name": "Jack",
"imageUrl": "http://lorempixel.nl",
"followers": ["user1"]
}
},
"feeds": {
"user1": {
"eventUpdates": {
"1": {
"timestamp": "13243543",
"creatorId: "1",
"eventId": "A",
"message": "Lorem ipsum"
}
},
"following": {
"user1": {
"name": "Jack",
"imageUrl": "http://lorempixel.nl",
"followers": ["user1"]
}
}
},
"events": {
"A": {
"name": "BeerFestival",
"date": "2018/09/05",
"creatorId": "1"
}
}
}
【问题讨论】:
-
在 Firestore 中,您可以使用参考作为字段值。当你进行非规范化时,使用引用来指向可以改变的事物。如果它不能或不应该改变,那么使用一个值。接下来,您需要异步加载您的消息。首先,检索消息列表,然后解析引用。根据您使用的技术,有许多选项,但基本上只是运行第二个查询。 Firestore 将在设备上缓存结果,因此对同一文档的后续查询只会返回缓存。
标签: database firebase data-structures nosql google-cloud-firestore