node.js - MongoDB 的正确结构
问题描述
一般来说,我对 mongoDB 和数据库相当陌生,我不确定设置不同属性的正确/典型结构是什么。
例如,假设我有一个名叫蒂姆的人,他可以打篮球、足球和网球。你怎么去陈述这个?你使用布尔值还是存储字符串数组?
这就是我认为的格式..这是正确的思考方式吗?
name: 'Tim',
sports: {
soccer: true,
tennis: true,
basketball: true,
football: false
}
解决方案
MongoDB 中的数据建模与 RDBMS 不同。使用 RDBM 的典型工作流程是,您定义实体及其属性以及它们的关系,然后将头撞到墙上以获得正确的“左上角”™ JOIN,以便数据为您提供所需的答案.
一般 NoSQL 数据库(尤其是 MongoDB)的典型工作流程是不同的。您首先确定需要由数据回答的问题,并对数据进行建模,以便以最有效的方式回答这些问题。因此,让我们玩这个。
你显然有一些人,他们参加的运动应该被记录下来。所以我们必须问自己的第一个问题是我们是嵌入数据还是引用数据。由于我们不太可能达到 16MB 的文档限制,因此嵌入似乎是一个不错的选择。现在,使用一个为每项可以想象的运动(稍后)保存布尔值的对象,我们不仅引入了不必要的冗长,而且与保存一组运动相比,我们添加了精确的 0 信息值:
{
Name: “Tim“,
Sports: [”Soccer”,“Tennis”,”Basketball”]
}
这使得以后引入新的运动变得更加容易(只需将所述运动附加到执行它的人的数组中),不会用不相关的数据污染每个文档,并且具有相同的信息价值。
推荐阅读
- python - 如何在 python2 和 python3 上运行代码
- python - 如何点击拒绝点击的可用按钮?
- apache-spark - 即席查询的 Impala 与 Spark 性能
- git - 从 https://git-scm.com/download/win 下载 Git 超级慢
- jquery - 如何防止填充传播到嵌入式表
- powershell - 如何在 Powershell 中搜索文件中的内容
- fasttext - fastText -autotune-validation 不起作用
- apache-spark - 为什么Spark在一个阶段后从文件中读取速度如此之快?
- angular - 为什么浏览器对 OPTION 请求得到 200 响应和 503 响应?
- python - Keras,使用 y_pred y_true 的不同属性最大化自定义损失