【问题标题】:How should I organize my MongoDB database?我应该如何组织我的 MongoDB 数据库?
【发布时间】:2016-10-16 03:47:43
【问题描述】:

我对使用数据库还很陌生,我一直在了解 NoSQL 和 MySQL 之间的区别。我正在构建一个 Web 应用程序,让用户可以创建事件以放入他们的日历中。

现在,我有一个用户名和密码集合,以及一个存储他们事件的每个用户的集合。但是当我阅读更多关于 NoSQL 的内容时,似乎我应该为所有事件创建一个集合,并将每个用户的事件存储在一个文档中。所以我的数据库中只有 2 个集合,一个用于用户名,一个用于事件。这似乎更有意义,但我最终会得到一个包含大量文档的非常大的事件集合。

这里的最佳做法是什么?我查看了很多 MongoDB 示例,但大多数只显示了具有一个集合的简单数据库。

【问题讨论】:

    标签: mongodb database nosql


    【解决方案1】:

    MongoDB 的有效建模并不那么明显。很少有明确的回应,但我会尽量给你一些提示。

    NoSQL 数据库的一个共同原则是根据您计划提出的请求对数据进行建模。如果您需要获取所有事件的列表,将所有事件存储在一个唯一的文档中会更有效。如果您需要获取给定用户的所有文档列表,请将其事件列表存储在描述该用户的文档中,依此类推。这可能会导致您复制一些数据:您可以同时拥有所有事件的列表和每个用户文档中的事件列表。

    然后出现了通常的困境:您是否应该在描述用户的每个文档中嵌入完整的事件描述,只是对该事件的引用,该事件存储在另一个文档中?

    这再次取决于您提出请求的方式。如果您必须更新事件,最好将它们的不可变属性仅(部分)嵌入到用户文档中(至少是一个 ID)。如果事件是不可变的——并且很可能在这个特定的用例中——你可以将整个事件描述嵌入到用户文档中。或者至少是加载用户时有用的事件描述的所有字段。

    考虑到大小,限制在MongoDB's documentation 中描述。

    【讨论】:

    • 我知道 NoSQL 背后的原则是让它按照我的要求进行,但我原以为 users 集合是一个例外,尤其是。如果我要存储密码、会话 cookie 等
    • 从我的角度来看,它遵循我上面描述的一般规则。密码和会话数据需要更新,因此您最好不要复制它们。 ==> 将它们包含在用户文档中,并将事件列表(或仅事件 ID)也存储在此文档中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多