如何在MongoDB中设计数据库模式?

lo8azlld  于 2022-09-18  发布在  Go
关注(0)|答案(1)|浏览(168)

我是一个在社交网站工作的新手,使用MongoDB作为数据库。您能帮助我在设计数据库时遵循什么方法吗?

我对数据库设计的要求和目标

最常见的查询将与用户交互相关,比如用户关注了什么主题,用户如何与帖子互动,该帖子在用户的新闻提要上出现了多少次,以及在一段时间后在什么时间进一步向他显示该帖子。我的目标不是计算点赞的数量,经常的评论数量,但他们问我想要的是快速获得保持性能的只是,这是用户感兴趣的帖子,检查他是否喜欢它。我也应该这么做:

1.对点赞、评论等进行不同的存储集合,包含互动用户的Posts集合和User集合的引用字段。例:

db.like.find()
{_id: , user_id: "the user_id of the user", post_id: [ALL THE POST_ID's USER LIKED]}
db.comment.find()
{_id: , user_id: "the user_id of the user", comments: [{_id: , post_id: , replied_to: [ LIST OF USERS REPLIED IN THE COMMENT], votes: [ LIST OF ALL THE VOTERS] , timestamp: }] }

1.创建集合中嵌入文档的列表,其中包含用户ID、POST_ID以及他与POST进行的任何交互。所以每个用户都有一个文档。并且在每个帖子交互中在列表中嵌入一个文档。
例:

db.all_the_interactions.find()
{_id: , user: ObjectId("1782..."), username: "Mark Alberto" interactions:[
{post_id: ObjectId("222..."), liked: True, "Comment": ["Hello"], timestamp},
{post_id: ObjectId("672..."), liked: False, "Comment": [], timestamp}
]}

{_id: , user: ObjectId("4355..."), username: "Himesh Reshamiya" interactions:[
{post_id: ObjectId("224..."), liked: True, "Comment": [], timestamp},
{post_id: ObjectId("562..."), liked: False, "Comment": ["Nice"], timestamp}
]}

1.为用户创建一个完整的集合,其中将存储他的所有互动。{_id,post_id,赞(如果他喜欢),(该特定用户所做的评论(如果有)的列表),评论的时间(如果有评论)}。例:

db.user_name.find()
{_id, post_id: 432.., liked: True, Comment: ['StackOverflow']}
{_id, post_id: 433.., liked: True, Comment: []}

1.将喜欢该帖子的所有用户存储在post集合本身的列表中,该集合是用于评论的嵌入文档的列表。例:

db.post.find()
{
 "_id" : ObjectId("62f7930758bcf38e4f920e87"),
 "username" : "Akshat Bafna",
 "fact" : "clone()rnCreate a copy of the current queryset.clone()rnCreate a copy of the current queryset.",
 "background" : "mongodb-logo-vector-2022.png",
 "creation_date_time" : "08/13/2022, 17:33:19",
 "topic": "MongoDB",
 "liked":[ALL THE USER_ID's LIKED THIS POST],
 "comments":[{_id: , user_id: ,"replied_to": [ LIST OF USERS REPLIED IN THE COMMENT], votes: [ LIST OF ALL THE VOTERS] , timestamp: } ]
 }

1.将用户喜欢的所有帖子以post_id列表的形式存储在User集合中

{ "_id" : ObjectId("62dee9d49974d78430d99af6"), 
"user_type" : "initiatives", 
"username" : "Anand Mahindra", 
"password" : "99fb2f48c6af4761f904fc85f967445665445d40b1f44ec3a9c1fa319", "email" : 
"mahindraanand@gmail.co", 
"last_login" : "N/A", 
"last_logout" : "N/A", 
"post_liked": [ALL THE POST_ID's USER LIKED],
"comments": [{_id: , post_id: ,"replied_to": [ LIST OF USERS REPLIED IN THE COMMENT], votes: [ LIST OF ALL THE VOTERS] , timestamp: }] }

由于MongoDB是一个动态数据库,设计数据库以获得最佳性能的正确标准应该是什么?

0x6upsns

0x6upsns1#

如果您需要要存储在文档中的所有数据,那么为此目的设计模式的最佳方法将是使用第二种和第三种方法的组合。文档将如下所示:

{ "_id" : ObjectId("6323c511a78cf05ddc91d868"), "userReference" : ObjectId("62c1f108449a868937fgg355"), "username" : "Akshat Bafna", "postId" : ObjectId("62f563ed918ea74846d3aa95"), "liked" : false, "lighten" : false, "timesViewed" : 1, "points" : 10, "timeList" : [ "16/09/2022 06:06:33" ] }
{ "_id" : ObjectId("6323c511a78cf05ddc91d869"), "userReference" : ObjectId("62c1f108449a868937edfs7f"), "username" : "Joe Bidden", "postId" : ObjectId("62f7785eb90971094fffe9d8"), "liked" : false, "lighten" : false, "timesViewed" : 1, "points" : 10, "timeList" : [ "16/09/2022 06:06:33" ] }
{ "_id" : ObjectId("6323c511a78cf05ddc91d86a"), "userReference" : ObjectId("62c1f108449a868937fgg355"), "username" : "Akshat Bafna", "postId" : ObjectId("62f7911c4191afb7b90641d6"), "liked" : false, "lighten" : false, "timesViewed" : 1, "points" : 10, "timeList" : [ "16/09/2022 06:06:33" ] }

InShort为什么我更喜欢这个?

1.因为包含嵌入文档的不断增长的阵列将是一个性能问题。
1.昂贵的写入和更新。
1.MongoDB的文档大小限制在16MB,因为不断增长的阵列永远不会停止文档的增长,这将是一个问题。
1.创建索引将变得昂贵。

有关详细信息,请参阅:Why shouldn't I embed large arrays in my documents?.

此外,您可能必须添加一些数据冗余以获得更好的性能,使用单个USER_INTERSACTIONS集合创建ttl索引,或者在对单个用户使用单独的集合时,如果不违反您的要求,可以使用带上限的集合。

相关问题