mongodb基本理论
毫无疑问,这将是一个愚蠢的问题,当答案指出它的简单性时,我们都会嘲笑它是多么愚蠢,但由于被灌输了关系数据库的艺术,我似乎无法完全理解mongodb——不管我读了多少文章或看了多少视频 这是我的情况。我有一个可能拥有数百万用户的项目。核心特点:mongodb基本理论,mongodb,database,nosql,Mongodb,Database,Nosql,毫无疑问,这将是一个愚蠢的问题,当答案指出它的简单性时,我们都会嘲笑它是多么愚蠢,但由于被灌输了关系数据库的艺术,我似乎无法完全理解mongodb——不管我读了多少文章或看了多少视频 这是我的情况。我有一个可能拥有数百万用户的项目。核心特点: 列出4种不同类型的用户 其中一种类型的用户可以创建事件 其他用户类型可申请在活动中执行(然后申请方和组织方之间有一个请求系统,以商定条款) 其他用户类型可以参加活动 所有用户类型都可以跟踪该事件 每个用户都可以将无限量的图像上传到他们的“图库” 现在我
- 列出4种不同类型的用户
- 其中一种类型的用户可以创建事件
- 其他用户类型可申请在活动中执行(然后申请方和组织方之间有一个请求系统,以商定条款)
- 其他用户类型可以参加活动
- 所有用户类型都可以跟踪该事件
- 每个用户都可以将无限量的图像上传到他们的“图库”
谢谢。起初,我建议只创建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一起存储来避免这种情况。查看我的编辑是的,但这是关于如何更好地反规范化数据库以满足某些需要的另一个大问题。啊哈,是的,这似乎是一个很好的解决方案