各种 mongodb 服务按磁盘使用计量。使用 mongodb 时有哪些节省空间的技巧?
谢谢。
这个问题确实比较模糊。有些事情可能适用于您,也可能不适用于您(排名不分先后):
最好用一个例子来说明这一点:
{
surname: "Smith",
forename: "John",
location: { grid_e: 100.02, grid_n: 450.08 }
}
可以通过删除各种字段名称中不必要的冗长来缩短以前的文档。
{
sn: "Smith",
fn: "John",
loc: { e: 100.02, n: 450.08 }
}
这将为您节省非常小的空间,但它将乘以每个文档的大小(字段数)和文档数(如果您有数百万,可能会变得很重要)。这是一篇很棒的帖子,讨论了这种方法的优点和缺点。
Capped collections 允许您指定要存储的文档数量的限制。它以先进先出的方式工作(最旧的文档将被丢弃)。如果您正在记录并希望存储最新x
文档但旧文档没有相关性,这尤其适用。
使用上限集合有一些注意事项。有关完整的详细信息,请参阅MongoDB 文档。
文档可以具有嵌入文档或与其他文档(在其他集合中)外键样式的关系。经常讨论 每种方法的优缺点,但最终由您选择适合您的方法。
以博客为例,可能每篇博文都有一个作者。您可以将此作者信息嵌入每个帖子中,也可以选择将它们放入自己的帖子authors
或users
收藏夹中。后一种方法将节省空间,特别是如果许多用户经常发布许多帖子(而不仅仅是一个或两个)。请注意,由于没有连接,您将产生额外的数据库调用。
除了嵌入它们之外,文档之间的关系还可以通过多种方式完成。您可以像这样使用相关文档的 ID(重用上面的博客示例):
{
_id: <whatever>,
title: "Document Relationships in MongoDB",
body: "bla bla bla bla",
// ...
user_id: <id of the user document>
}
在users
集合中,该相关文档将存在:
{
_id: <whatever>,
name: "Mark Embling",
email: "example@markembling.info",
///...
}
这可能是最简单的关系方法(除了嵌入它们),但完全由您自己的代码来维护它。您需要在需要时进行调用以获取相关用户,并在必要时对其进行更新。也就是说,我认为这种方法没有任何问题,并且已经看到它在一些场合使用过。
类似的方法是使用 DBRef。这是描述上述关系的更正式的方法。不只是将另一个文档的 ID 放入其中,而是指定一个 DBRef,它是对另一个文档的一种引用,形式化。我希望这是有道理的。我在此处描述的两种方法都在 mongodb 文档中进行了详细讨论。值得注意的是,手动引用将比 DBRef 占用(稍微)更少的空间,因为 DBRef 包含额外的(可能是冗余的)信息,例如引用了哪个集合。不过,它的优点是被许多驱动程序库原生支持,所以它让你的生活更轻松一些。
最终,哪些方法有效且相关,取决于您正在尝试做什么。考虑选项,权衡并决定是否应该做某事。并进行实验。
如果存储大量不需要搜索的数据,请尽量避免重复数据并可能使用某种形式的压缩。
我认为好的方法是使用一个文档来获取相关数据
例如,如果您有用户集合,您可以向每个用户提供文档,并在此文档中植入其他内容,如头像或 acl 等