在哪里存储对其他数据模型的引用(在 mongoDB 中)以获得最佳性能
Where to store a reference to other data models (in mongoDB) for best performance
在我的项目中,我有用户和圈子。圈子可以有多个用户,一个用户可以在多个圈子中。最后是事件。每个事件在一个圈子中可以有多个用户。之后,事件会获取很多内容,因此会加载很多东西(图片、评论等)。
我认为这些将是一个很好的数据模型:
User = {
_id: "uuid",
name: "string",
password: "string",
circles: [Circle._id],
}
Event = {
_id: "uuid",
name: "string",
location: "string",
circles:Circle._id,
participants: [User._id],
}
Circle = {
_id: "uuid",
name: "string"
}
用户登录后,he/she选择他的圈子之一,将显示该圈子中的用户和事件。
使用这些数据模型(我认为)的 API 意味着从一个圈子中获取用户和事件,数据库必须搜索所有用户和事件并检查他们是否在该圈子中.有很多用户和事件,我认为这可能不是最有效的方法?
所以我想像这样将用户和事件放入圆的数组中:
User = {
_id: "uuid",
name: "string",
password: "string",
}
Event = {
_id: "uuid",
name: "string",
location: "string",
participants: [User._id],
}
Circle = {
_id: "uuid",
name: "string",
users:[User._id],
events:[Event._id]
}
现在,当用户选择圆圈时,圆圈加载速度较慢,因为必须先加载用户和事件。但我在想,现在搜索用户和事件会更快。这是正确的 approach/thinking 吗?在用户和事件数据模型中保留对特定圈子 ID 的引用是否有意义?
如果您想充分利用 mongoDb,我强烈建议您对数据进行反规范化处理。
如果您规范化数据,则可能必须使用 $lookup 来合并多个集合。即使你在硬盘上存钱,你最终也会有相对较重的计算。
假设应用程序通常有 90% 的读取命中和 10% 的写入命中,以读取友好的方式对数据建模是有意义的。因此,高度非规范化您的数据,直到确实有必要创建对其他集合的引用。稍后可以通过索引和缓存实现优化,但请考虑以下场景。
User = {
_id: "uuid",
name: "string",
password: "string",
circles: ["circle1","circle2"],
events : ["event1","event2"]
}
Event = {
_id: "uuid",
name: "string",
location: "string"
}
Circle = {
_id: "uuid",
name: "string"
}
尝试事先了解您的查询,将大部分数据存档在 User
集合中。 circles
和 events
字段在 User
集合中也可以是一个对象数组 [{},{}]
如果要存储更多的属性。
我敢肯定,你收集的集合越多,你的查询就会越复杂,计算量也会越大。
我不建议将 userId 存储在 circle
或 event
集合中,因为用户可能会随着时间的推移而增长,并且您不希望最终得到一个包含一个文档的文档的集合,其中一个字段存储了数千个数组元素.相反,一个用户可以成为 100 多个圈子和事件的一部分,如果我们将这些数据存储在 User
集合中,查询和管理就会变得非常容易。
长话短说:不要将 nosql 数据库视为关系数据库。它永远不会适应。为您的数据库建模,牢记您未来的查询。高度非规范化您的数据以使您的阅读更简单,即避免引用。
在我的项目中,我有用户和圈子。圈子可以有多个用户,一个用户可以在多个圈子中。最后是事件。每个事件在一个圈子中可以有多个用户。之后,事件会获取很多内容,因此会加载很多东西(图片、评论等)。
我认为这些将是一个很好的数据模型:
User = {
_id: "uuid",
name: "string",
password: "string",
circles: [Circle._id],
}
Event = {
_id: "uuid",
name: "string",
location: "string",
circles:Circle._id,
participants: [User._id],
}
Circle = {
_id: "uuid",
name: "string"
}
用户登录后,he/she选择他的圈子之一,将显示该圈子中的用户和事件。
使用这些数据模型(我认为)的 API 意味着从一个圈子中获取用户和事件,数据库必须搜索所有用户和事件并检查他们是否在该圈子中.有很多用户和事件,我认为这可能不是最有效的方法?
所以我想像这样将用户和事件放入圆的数组中:
User = {
_id: "uuid",
name: "string",
password: "string",
}
Event = {
_id: "uuid",
name: "string",
location: "string",
participants: [User._id],
}
Circle = {
_id: "uuid",
name: "string",
users:[User._id],
events:[Event._id]
}
现在,当用户选择圆圈时,圆圈加载速度较慢,因为必须先加载用户和事件。但我在想,现在搜索用户和事件会更快。这是正确的 approach/thinking 吗?在用户和事件数据模型中保留对特定圈子 ID 的引用是否有意义?
如果您想充分利用 mongoDb,我强烈建议您对数据进行反规范化处理。
如果您规范化数据,则可能必须使用 $lookup 来合并多个集合。即使你在硬盘上存钱,你最终也会有相对较重的计算。
假设应用程序通常有 90% 的读取命中和 10% 的写入命中,以读取友好的方式对数据建模是有意义的。因此,高度非规范化您的数据,直到确实有必要创建对其他集合的引用。稍后可以通过索引和缓存实现优化,但请考虑以下场景。
User = {
_id: "uuid",
name: "string",
password: "string",
circles: ["circle1","circle2"],
events : ["event1","event2"]
}
Event = {
_id: "uuid",
name: "string",
location: "string"
}
Circle = {
_id: "uuid",
name: "string"
}
尝试事先了解您的查询,将大部分数据存档在 User
集合中。 circles
和 events
字段在 User
集合中也可以是一个对象数组 [{},{}]
如果要存储更多的属性。
我敢肯定,你收集的集合越多,你的查询就会越复杂,计算量也会越大。
我不建议将 userId 存储在 circle
或 event
集合中,因为用户可能会随着时间的推移而增长,并且您不希望最终得到一个包含一个文档的文档的集合,其中一个字段存储了数千个数组元素.相反,一个用户可以成为 100 多个圈子和事件的一部分,如果我们将这些数据存储在 User
集合中,查询和管理就会变得非常容易。
长话短说:不要将 nosql 数据库视为关系数据库。它永远不会适应。为您的数据库建模,牢记您未来的查询。高度非规范化您的数据以使您的阅读更简单,即避免引用。