mongodb - 这是在 MongoDB 中建模数据的正确方法吗?
问题描述
我是数据建模的新手,正在从事一个个人项目,用户可以在该项目中将照片上传到容器中。这些容器可以嵌套(例如:“Japan”容器可能有一个名为“Cats”的子容器,您可以在其中存储您在日本看到的所有猫的图片)。
我想象 3 个实体:用户、容器和照片,其结构如下:
用户收藏:
{
User_id: userId101,
userName: “Chase”,
Email: “chase@email.com”,
Containers: [{name: “Thailand”, parentContainer: null}, {name: “Food”, parentContainer:
“Thailand”],
}
容器集合:
{
Id: cont_01,
Name: “Thailand”,
ownedBy: userId101
parentContainer: null,
Photos: [“photoId1”, “photoId2”, etc.]
{
照片收藏:
{
Id: photo_01,
userRef: userId101
Url: “www.unsplash.com/1279178298”
}
在我花费数周时间构建它之前,我只想知道我是否遗漏了任何会破坏它的主要细节。
非常感谢 :)
解决方案
这里确实有多个因素可以考虑。首先你不需要认为每个“实体”都应该有一个单独的集合(就像在 SQL 中一样) BSON 可以处理嵌套数组,如下所示:
{
Id: cont_01,
Name: "Thailand",
ownedBy: userId101
parentContainer: null,
Photos: [ { id: "photo_01", "www.unsplash.com/1279178298" }]
}
“加入” ( $lookup ) MongoDB 中的数据是额外的开销,因此请保持合并,除非您有充分的理由将其划分为多个集合。
像上面那样建模数据使您可以使用$graphLookup来获取父子关系树。
这就是我要开始的。作为下一步,您可以考虑将用户数据嵌入到每个容器(非规范化)中,以避免使用$lookups
或拥有单个user
文档,其中包含已嵌入的容器数组photos
- 更难维护(更新有点复杂,就像这里一样)但更好的读取性能,因为你不需要查找。
拥有超大文档的缺点也是 16MB 的文档大小限制,这个限制很大,但最好记住这一点。
推荐阅读
- networking - 在c中实现选择性重复协议的滑动窗口的最佳方法
- python - 使用 fsolve 求解涉及 numpy 数组之和的单个非线性方程
- php - 在 PHPmailer 中使用 noreply@domail.com 代替域
- nginx - IP地址不能被外部访问
- javascript - 循环类型引用 TypeScript 扩展
- mysql - MySql 的 INSERT ... ON DUPLICATE KEY UPDATE ...未按预期工作
- java - Java swing:哪个组件处理鼠标事件来调整 JFrame 或 JDialog 的大小
- reactjs - ReactJS 和 Docker - 无法启动我的应用程序:react-scripts.js:未找到
- php - 如果 WooCommerce 购物车为空,则隐藏一些 html 元素
- angular - 如何使用异步加载预选 PrimeNG 下拉组值