【发布时间】:2019-02-26 12:32:32
【问题描述】:
对于 Facebook 类型的社交网络应用程序,需要高性能的数据库结构,以便将数据存储在 Firebase(Cloud Firestore) (NoSQL) 中。
要存储的数据:
- Userinfo (name, email etc)
- Friends
- Posts
- Comments on posts.
关于查询性能(如果数据库变得庞大),我对以下两种数据库结构感到困惑。
(参考:C_xxx 是 Collection,D_xxx 是文档)
结构1
C_AllData
- D_UserID-1
name: xxxx,
email: yyy,
friends: [UserID-3, UserID-4]
- C_Posts
- D_PostId-1
Text: hhh
Date: zzz
- C_Comments
- D_CommentId-1
UserID: 3
Text: kkk
- D_CommentId-2
UserID: 4
Text: kkk
- D_PostId-2
Text: hhh
Date: zzz
- C_Comments
- D_CommentId-3
UserID: 3
Text: kkk
- D_CommentId-4
UserID: 4
Text: kkk
- D_UserID-2
name: xxxx,
email: yyy
friends: [UserID-5, UserID-7]
- C_Posts
- D_PostId-3
Text: hhh
Date: zzz
- C_Comments
- D_CommentId-5
UserID: 5
Text: kkk
- D_CommentId-6
UserID: 7
Text: kkk
结构2
C_AllUsers
- D_UserID-1
name: xxxx,
email: yyy
friends: [UserID-3, UserID-4]
- D_UserID-2
name: xxxx,
email: yyy
friends: [UserID-5, UserID-7]
C_AllPosts
- D_PostId-1
UserID: 1
Text: hhh
Date: zzz
- C_Comments
- D_CommentId-1
UserID: 3
Text: kkk
- D_CommentId-2
UserID: 4
Text: kkk
- D_PostId-3
UserID: 2
Text: hhh
Date: zzz
- C_Comments
- D_CommentId-5
UserID: 5
Text: kkk
- D_CommentId-6
UserID: 7
Text: kkk
我的问题是这两种方法的优缺点是什么?
我能想到的几点如下,如果我错了,请纠正我。
结构 1:
获取给定用户的所有帖子,在结构 1 中更快吗?因为我们要精确定位到确切的集合( AllData/{UserID}/Posts/ )
由于整个数据库都在一个集合之下,扩展性不好吗?
结构 2:
分区数据库 -> 更好的可扩展性?
划分 DB -> 更好的性能?
更少的嵌套 -> 更好的性能?
一个集合下的AllPosts -> 查询慢?
或者如果你能推荐一个更好的模型,那也很棒。
【问题讨论】:
-
嘿,到底什么最适合你?你介意发布数据结构吗?这将非常有帮助。
标签: database mongodb firebase nosql google-cloud-firestore