【发布时间】:2013-01-31 03:25:24
【问题描述】:
案例: 系统中有用户,并且有静态文档(如书籍)每个用户可能会使用一些文档,并为他的每个文档具有特定的状态/设置(如文档中的当前位置/页面、书签/注释)。
将用户和文档特定信息存储在具有两个键 userId 和 documentId 的平面集合中的更好方法是什么,或者 _id 等于 userId 的集合和 _id 等于 documentId 的子文档的嵌套数组(在这种情况下,集合是也用于存储非文档特定的用户数据)?
第一个场景:find({userId: ..., documentId:...})
第二个场景:findBy({_id:...}),然后找到_id等于documentId的子文档
第一种情况的优点:
1) 我相信更快的查找和保存操作。
第一种情况的缺点:
1) 更多的文档
2) 无法在集合中存储一些与文档无关的用户特定数据
第二种情况的优点:
1) 更好地表示数据关系(虽然是主观的)
2) 可以使用同一个集合来存储一些其他非特定文档相关的用户数据。
第二个缺点:
1) 更难的搜索和更难的保存操作(我使用的是 Mongoose ODM,代码不会很复杂),而且我认为操作速度不如第一种情况。
需要考虑的一些事项:
1) 通常在读取操作中我会只选择一个文档特定数据
2) 我需要经常保存一个文档的特定数据(例如定期保存用户正在使用的文档中的位置)。
3) 用户/文档状态可能有一些嵌套数组(书签、注释)需要更改(插入/删除文档)
考虑到这一点,我会说第一种情况更适合该任务,但我想听听一些专业人士的意见,两种情况是否有很大差异。
【问题讨论】:
-
一般来说,不用担心写性能。针对您的查询进行优化。
-
@Esteban Araya 谢谢,但是“优化查询”是什么意思?你对第一种或第二种情况有什么偏好,你会选择哪一种?