Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb基本理论_Mongodb_Database_Nosql - Fatal编程技术网

mongodb基本理论

mongodb基本理论,mongodb,database,nosql,Mongodb,Database,Nosql,毫无疑问,这将是一个愚蠢的问题,当答案指出它的简单性时,我们都会嘲笑它是多么愚蠢,但由于被灌输了关系数据库的艺术,我似乎无法完全理解mongodb——不管我读了多少文章或看了多少视频 这是我的情况。我有一个可能拥有数百万用户的项目。核心特点: 列出4种不同类型的用户 其中一种类型的用户可以创建事件 其他用户类型可申请在活动中执行(然后申请方和组织方之间有一个请求系统,以商定条款) 其他用户类型可以参加活动 所有用户类型都可以跟踪该事件 每个用户都可以将无限量的图像上传到他们的“图库” 现在我

毫无疑问,这将是一个愚蠢的问题,当答案指出它的简单性时,我们都会嘲笑它是多么愚蠢,但由于被灌输了关系数据库的艺术,我似乎无法完全理解mongodb——不管我读了多少文章或看了多少视频

这是我的情况。我有一个可能拥有数百万用户的项目。核心特点:

  • 列出4种不同类型的用户
  • 其中一种类型的用户可以创建事件
  • 其他用户类型可申请在活动中执行(然后申请方和组织方之间有一个请求系统,以商定条款)
  • 其他用户类型可以参加活动
  • 所有用户类型都可以跟踪该事件
  • 每个用户都可以将无限量的图像上传到他们的“图库”
现在我马上就知道如何对MySQL数据库进行规范化,并加入查询以获取所需的数据,但mongodb呢

由于所有这些信息都与用户有关,我是否只为用户创建一个集合?我是否为每个用户创建一个文档?该文档是否存储了与该用户相关的事件、请求和图像的所有详细信息,或者只是我随后交叉引用的这些内容的某种id?如果不是,这不会复制大量数据吗?例如,如果我必须复制该事件发生/参与/执行的每个用户的所有事件数据,并将其放入该用户文档中(我确定不是这样的-但是如果没有连接,如果事件存储在另一个集合中,我如何“连接”用户和所有事件数据?)。图像呢?一个用户文档可以是16mb—但是如果我允许无限的图像,并且与用户相关的所有内容都存储在一个文档中,那么图像本身就可能比单个文档大

我敢肯定,我不了解非常重要的了解mongodb-启发我


谢谢。

起初,我建议只创建UserDocument并将所有事件相关集合嵌入到用户中,将来您将看到事件是否会是大集合(超过mongodb限制4mb),您将其移动到单独的集合中。至于图像,请看mongodb特性,它允许您存储任意大小的文件。在用户文档中,只能存储fileId的集合

当您开始设计文档数据模式时,总是从嵌入evething开始,稍后您将看到需要移动到单独集合中的内容。例如,在您的情况下,如果您需要显示所有事件的列表,您无法轻松完成,因为您需要加载每个用户并获取嵌入的事件集合,在这种情况下,需要在单独的集合中移动事件

更新:

因为您需要从任何用户文档中引用事件,所以需要将事件移动到单独的集合中,因为引用嵌入的集合总是不好的

因此,在与我讨论之后,我认为以下方案应该适合您的需要:

UserDocument Collection
    -UserId
    -Type
    -Details    
    -Events(EventId)
    -AppliedEvents
    -AttendingEvents
    -Files(it's not actual files it just references to gridFs filess)

EventDocument Collection
    -EventId
    -EventDetail   
    -FollowingUsers

我几乎将所有内容都转移到了UserDocument中,因为用户是一个“强大”的实体,您将与用户合作,而不是与事件合作(对我来说似乎如此)。

您可以使用两个不同的用户和事件集合来设计您的应用程序。像这样的

UserDocument Collection
    -Type
    -Details    

EventDocument Collection
    -Created By
    -EventDetail
    -AppliedUsers
         -"User A",User B"
    -AttendingUsers
         -"User C",User D"
    -FollowingUsers
         -"User E",User F"
Event documet使用获得了应用、参与和跟踪用户的所有用户ID

另一种方法是存储频繁访问的用户文档字段和DBref对象。这样可以避免对数据库进行不必要的点击,并在文档中存储冗余(完整的用户数据)。差不多

 EventDocument Collection
    -Created By
    -EventDetail
    -AppliedUsers
         -"User"
             - Name
             - XXX
             - DbRef to User A
    -AttendingUsers
         -"User"
             - Name
             - XXX
             - DbRef to User B

    -FollowingUsers
         -"User"
             - Name
             - XXX
             - DbRef to User C

         -"User"
             - Name
             - XXX
             - DbRef to User D

对于图像,可以使用GridFs。这将把大文件分成更小的块

你应该遵循这些建议that@Bugai13@Ramesh Vel建议您设计数据库、图像和数据库参考。我只是想澄清几件事

如果不是的话,这不是会复制很多吗 数据量-即如果我必须复制 每个用户的所有事件数据 跟随/出席/表演 事件并将其放在该用户中 文件

在存储成本很高的时候,人们提出了关系数据库的规范化,因此将数据拆分为多个数据,并使用连接进行重构。现在,存储相对来说非常便宜,如果您需要性能,那么数据的重复是完全不受欢迎的。但是,它确实取决于应用程序、查询模式、存储的数据量以及所需的读/写速度。但是,您会说,更多的写入(因为没有标准化)不会导致性能更差吗?不一定,这取决于应用程序。如果您对此感到担忧,请查看切分(对于MongoDB:)

但是如果没有加入,我怎么才能得到“加入” 如果发生事件,则显示用户和所有事件数据 是否存储在另一个集合中

还要注意的是,据我所知(很高兴得到纠正),MongoDB中没有“join”操作。这只发生在一些司机身上。正如文件中所说:

DBRef的优点是允许 可选的自动客户端 与一些司机解除联系


请注意,解引用仅在客户端发生,并且仅在“某些”驱动程序中发生。据我所知,PHP可以,但Java驱动程序不能——您必须在应用程序级别处理连接,方法是从单独的集合中获取两个结果集,并手动连接它们,尽管有DBRef

据我所知,您可以嵌入或引用其他模型。这是一个很好的解决方案,但我认为最好从嵌入开始。以您的模式为例,您可以快速显示已分配事件的用户,因为您需要迭代所有用户。@Bugai13,但我们可以通过将频繁访问的用户字段与DBRef一起存储来避免这种情况。查看我的编辑是的,但这是关于如何更好地反规范化数据库以满足某些需要的另一个大问题。啊哈,是的,这似乎是一个很好的解决方案