Database design 高效查询的设计

Database design 高效查询的设计,database-design,architecture,nosql,Database Design,Architecture,Nosql,我有一个NoSQL数据库,其中包含用户集合和Post集合。每个用户都有一个帖子,可以跟随其他用户(他们的朋友) 用户只能查看以前从未查看过的朋友的帖子。一旦它被查看,它就不再向他显示 我正在试图找到一种设计此需求的方法,以便它能够有效地检索用户未查看的帖子 我有两个想法,两个都不是很有效: 在User下创建一个子集合,名为NonViewedPosts,其中每次好友发帖时,其好友的帖子id都会添加到该子集合下。当该用户查看帖子时,其条目将被删除。但这意味着,每当用户发布帖子时,他们必须将自己添加到

我有一个NoSQL数据库,其中包含
用户
集合和
Post
集合。每个
用户
都有一个
帖子
,可以跟随其他
用户
(他们的朋友)

用户
只能查看以前从未查看过的朋友的
帖子
。一旦它被查看,它就不再向他显示

我正在试图找到一种设计此需求的方法,以便它能够有效地检索
用户未查看的
帖子

我有两个想法,两个都不是很有效:

  • User
    下创建一个子集合,名为
    NonViewedPosts
    ,其中每次好友发帖时,其好友的帖子id都会添加到该子集合下。当该用户查看帖子时,其条目将被删除。但这意味着,每当用户发布帖子时,他们必须将自己添加到其所有好友
    NotViewedPosts
    子集合中。如果他们有很多朋友,这可能是低效的

  • Post
    下有一个子集合,名为
    viewsed
    ,该子集合以空开头,当Post被查看时,它将被填满。然后,我必须查询
    查看的
    ,看看我是否发现自己在每个好友帖子的收藏中。如果我有很多朋友,如果我的朋友有很多观点,那么这也是低效的


  • 还有其他我没有想到的解决方案吗?

    在构建这样的系统时,您几乎应该始终尝试针对读案例而不是写案例进行优化。在这种情况下,您的读操作仍将是写操作,但您仍然希望针对用户正在“阅读”的情况进行优化,即寻找要阅读的新帖子。对的阅读场景可能比发布场景更常见


    因此,将针对推送模型进行优化(场景1)。在任何情况下,您都不必针对其中一个或另一个进行优化。您必须推送或拉取有关好友帖子的信息。

    或者在模式中添加一个新列,在用户查看帖子后进行修改,怎么样?阅读时,您可以编写一个查询,根据该查询筛选出结果column@RamkumarVenkataraman我正在处理文档和集合,而不是有列的表,所以我认为这个想法有点像我在文章中提到的第二个想法。我不认为我可以在Post下添加一个属性(列)来处理每个朋友的视图状态。也许我不太明白,“读”比“写”要频繁得多。我只是想知道是否有什么我没有想到的东西可以让read查询更简单。场景1听起来像是一个糟糕的设计吗?假设一个受欢迎的用户(名人)有100000个追随者,那么他们就必须向100000个不同用户的“非视频帖子”子集合写信?现在我在想,我不确定阅读是否会那么频繁。对于这个场景的阅读实际上只需要在我的应用程序启动时进行(获取所有未查看的帖子)。启动后,将不再有大量的阅读,只有新帖子的文档监听器,从那时起,用户在重新启动应用程序之前都会频繁地发布(写入)文章。您可能会考虑导致内容被查看的阅读。用户可能会阅读很多次,寻找新的内容来查看。这些文件中的大多数都是空的,但它们仍然会产生读取的成本。