mongoDB——存储相同数据的两种方法的优缺点

mongoDB - pros and cons of two approaches to store same data

本文关键字:两种 优缺点 方法 存储 mongoDB 数据      更新时间:2023-09-26

我正在编写简单的健身应用程序来教自己更好的节点。

用户可以保存他的电梯信息。更准确地说,他会加上运动、重复、举重和日期。

我可以想到两种存储这些数据的方法。

首先

{username: "username",
exercises: {
    deadlift: [{
            reps: 5,
            weight: 100
            date: some date
        },
        {
            reps: 6,
            weight: 110,
            date: somedate
        }
        ]},
    squat: [{
            reps: 5,
            weight: 100
            date: some date
        }]
}

这意味着每个用户都将拥有自己的对象,包含其用户名和不同的练习以及该练习的不同尝试。

第二种方法是收集所有用户的尝试对象,就像这样

{   
    username: "username",
    exercise: "deadlift",
    reps: 5,
    weight: 100,
    date: somedate
}

在现实生活中,这两种方法中的一种会更好吗?如果是,时间和原因?

最终,我认为这取决于您想要运行的查询类型。以下是一些快速的想法:

第一种方法的优点是,对于给定的用户,您可以通过一次查找立即了解他/她的所有练习。这对于缓存也很有用,具体取决于应用程序。这种方法的缺点是,如果您有一个过度热心的举重者,您最终可能会耗尽文档中存储练习的空间(如果我没记错的话,限制为16mb)。此外,它使我所谓的"分析查询"变得更加困难,例如,在用户中找到趋势,诸如此类的事情。由于每次都要增长一个文档,所以我不知道最终的磁盘布局会是什么样子(不太熟悉新的存储引擎)。如果每次用户练习时文档的大小都增加,这可能会导致磁盘上的一些空间浪费。

第二种方法的优点是您不必担心任何限制。诚然,这可能不是一个需要解决的问题。我想大多数情况下,您的用户进入一个练习,然后不碰它,所以您可能会绕过磁盘问题。此外,它还允许您执行更高级的查询,例如确定用户中常见/流行的练习。我认为这样的分析比较好。缺点是,根据您选择索引的内容,查询涉及到查找给定用户的所有练习时实际执行的操作。如果你以用户名为索引,并且你只计划运行查询来查找用户做什么锻炼,那么你可能很好。

我更倾向于使用第二个,因为它对我来说似乎更灵活一些。