因此,我想创建一种社交媒体应用程序,并使用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现在在用户的新闻提要中-我如何查询所有可见的帖子(forFriendsOnly:no)以及仅限朋友的所有帖子,即当前用户在作者的朋友子集中。
另外,如果用户更改了他的名字,我如何为他以前的所有帖子和与该用户相关的所有保存帖子相应地更改他的姓名?(位于user likedpost子集合中)
发布于 2019-01-17 04:37:08
我猜你问了两个问题。
首先,Firestore建议使用数据复制,而不是跨集合连接查询。您设计帖子和用户的方式必须依赖于SQL中的查询概念。
如果您不介意将所有作者朋友id作为一个数组放在post文档中,那么仍然可以实现这一点。同时,在作者添加/删除好友时,需要通过触发器函数同步作者的好友数组。
我真的不推荐这种解决方案,因为作为一个社交平台,用户的朋友可能会不断变化,然后你必须不断更新他的帖子的朋友数组。
还有另一个解决方案,那就是在user下面再添加一个子集合,作为他的可见“feed”。然后,每当作者创建一个帖子时,触发器函数就会将这个帖子的摘要写到他所有朋友的可见“feed”集合中。
然而,如果你关心准确性,实时性,成本等,上述两种解决方案都不是完美的。我想这是我们不得不忍受的缺点。如果你必须实现和SQL一样的东西,我想唯一的选择就是使用其他的查询部分的解决方案,比如elastic search,mysql,neo4j等等。
关于你的第二个问题,如果你认为你的用户会频繁地更改他们的用户名,一种方法是不重复用户名。并且总是通过用户集合中的用户id来查询用户名。另一种方法是在用户更改用户名时,使用触发器函数更新重复的用户名。我推荐第二种方式,因为用户不会频繁更改他们的名字。
发布于 2019-01-17 04:48:19
不一定与您的原始问题相关,但是您的LikedPosts子集可能需要重新构建。如果你能确保你的postId的唯一性,那么它应该是这样的:
LikedPosts (subcollection)
postId: Unique identifier for liked post
authorUserId: String
authorUsername: String
text: String
imagePath: String当前的结构只允许一个点赞帖子,所以您需要将其更改为每个点赞帖子一个文档,或者一个包含所有点赞帖子ids列表的文档。
https://stackoverflow.com/questions/54217353
复制相似问题