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

时间:2015-09-12 21:32:47

标签: javascript node.js mongodb

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

用户可以保存有关其升降机的信息。更确切地说,他将插入锻炼,重复,举重和日期。

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

第一

{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
}

这两种方式中的一种在现实生活中会更好吗?如果是,何时以及为什么?

1 个答案:

答案 0 :(得分:1)

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

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

第二种方法的优点是您不必担心任何限制。不可否认,这可能不是一个问题。我想在大多数情况下,您的用户进入练习然后不接触它,因此您可能会解决磁盘问题。此外,它还允许您执行更高级的查询,例如确定哪些练习在您的用户中常见/受欢迎。我认为这种分析会更好。缺点是,根据您选择索引的内容,查询更多地涉及实际执行的内容以查找给定用户的所有练习。如果您对用户名进行索引,并且您只计划运行查询以查找用户执行的操作,那么您可能没问题。

我更倾向于选择第二个,因为它对我来说似乎更灵活。