高效 MongoDB 存储的字典或固定大小的列表

Dictionary or fixed-size list for efficient MongoDB storage

我已经阅读了 BSON 与 JSON 的工作原理,但我仍然无法得出结论,以下哪个在 MongoDB 中更有效地存储:

Ex1:

[
    { "f1": "smth", "f2": 0.8, "f3": [[1,2],[3,4]], "f4": 0 },
    { "f1": "smth", "f2": 0.8, "f3": [[1,2],[3,4]], "f4": 0 },
    { "f1": "smth", "f2": 0.8, "f3": [[1,2],[3,4]], "f4": 0 }
]

Ex2:

[
    ["smth", "smth", "smth"],
    [0.8,0.8,0.8],
    [[[1,2],[3,4]],[[1,2],[3,4]],[[1,2],[3,4]]],
    [0,0,0]
]

当然,无论重复值如何,我担心由于重复的字典键(即“f1”、“f2”、“f3”、“f4”),Ex2 会占用更少的存储空间space,尤其是当数据库中的文档数量以百万计时。我当然考虑到在 Ex2 中,不同索引处的每个数组都具有未直接声明的含义(如 Ex1 - "f1"...)。

首先,您的应用程序需要正常工作。如果它不提供有用的功能,那么它的速度有多快都没有关系。假设你正在实施一个真实的项目,这些通常不仅有重要的需求,而且需求会随着时间的推移而变化。以让您的应用程序完全不灵活为代价来优化您的数据模型(无论使用何种数据库都很难更改)通常会以项目失败而告终。

如果需要,您可以缩短字段名称。例如 Mongoid 提供了这个功能 out of the box.

“固定大小列表”对于 MongoDB 而言不是一个有意义的术语。所有数组都可以是任意大小,并且大小在数组中进行了编码。如果您使用某些类型,MongoDB 不会像具有固定行大小的关系数据库那样实现。

正如 prasad 所说,一旦您开始尝试以任何有意义的方式查询它,您的第二个选项可能很快就会变得不可用,但是,如果您使用 MongoDB 作为只写数据存储并且您的模式将在项目的整个生命周期内得到修复,当然,如果您省略字段名称并使用数组,您的数据将占用更少的磁盘 space 并且插入速度会更快。

另一方面,如果您想要一个仍然可查询的廉价批量数据存储,请尝试 https://docs.mongodb.com/datalake/