所以我想创建一种社交媒体应用程序并将Firestore用作主要数据库。
目标是创建“ facebook”新闻提要。
每个用户都有一个朋友列表,每个用户都可以创建帖子。
每个帖子都可以修改为对应用程序的所有用户或仅用户好友可见。因此,每个用户都可以将帖子发布给他的所有朋友,也可以将帖子发布给应用程序中的每个人。
还,用户可以在新闻源中“保存”他们喜欢的帖子。(LikedPosts子集合)
USERS (collection)
DocumentID - userId gathered from Authentication uid
firstName: String
lastName: String
username: String
birthdate: Timestamp
accountCreationDate: Timestamp
FRIENDS (subcollection)
DocumentID - userId of the friend
username: String
LikedPosts (subcollection)
authorUserId: String
authorUsername: String
text: String
imagePath: String
POSTS (collection)
DocumentID - postId randomly generated
authorUserId: String
authorUsername: String
text: String
imagePath: String
likesCount: Number
forFriendsOnly:yes
LIKES (subcollection)
DocumentID - userID of the liker
username: String
现在在用户的新闻提要中-如何查询当前用户在作者friends子集合中的所有可见帖子(forFriendsOnly:no)以及仅对所有朋友的帖子进行查询。
如果用户更改了他的名字,我该如何为他以前的所有帖子以及与该用户相关的所有保存帖子相应地更改他的名字?(位于用户Likedpost子集合中)
答案 0 :(得分:0)
我猜你在问两个问题。
首先,Firestore建议进行数据复制,而不是跨集合加入查询。您设计帖子和用户的方式必须依靠SQL中的查询概念。
如果您不介意将所有作者的朋友ID作为该帖子文档内部的数组,仍然可以实现。同时,当作者添加/删除朋友时,您必须通过触发功能同步作者的朋友数组。
我不会真的推荐此解决方案,因为作为社交平台,用户的朋友可能会不断变化,因此您必须继续更新其帖子的所有朋友数组。
还有另一种解决方案,即在用户下方添加一个子集合作为其可见的“提要”。然后,无论何时作者创建帖子,触发功能都会将该帖子的摘要写到他所有朋友的可见“提要”集合中。
但是,如果您担心准确性,实时性,成本等问题,上述两种解决方案都不完美。我想这是我们必须忍受的缺点。如果您必须实现与SQL相同的功能,那么我猜唯一的选择是对查询部分使用其他解决方案,例如弹性搜索,mysql,neo4j等。PS:您仍然可以将其与云函数包装在一起。
关于第二个问题,如果您认为用户会经常更改其名称,则一种方法是不要重复使用用户名。并始终通过用户集合中的用户ID查询用户名。另一种方法是在用户更改名称时使用触发器功能更新重复的用户名。我建议第二种方式,因为用户不会经常更改其名称。
答案 1 :(得分:0)
不一定与您的原始问题有关,但是您的LikedPosts
子集合可能需要进行重组。如果您可以确保自己的postId
的唯一性,那么可能应该是这样的:
LikedPosts (subcollection)
postId: Unique identifier for liked post
authorUserId: String
authorUsername: String
text: String
imagePath: String
当前结构仅允许一个喜欢的帖子,因此您需要将其更改为每个喜欢的帖子一个文档,或包含所有喜欢的帖子ID列表的文档。