MongoDB 模式 design/join 在 mongodb 中
MongoDB schema design/join in monogo db
我是 MongoDB 的新手,在 SQL 方面有很强的背景,不知道设计以下场景的理想方法是什么:
我有一组机器向主机发送 ping,我需要知道哪些机器在过去 10 分钟内发送了 ping。
我有 2 个合集:
pings
- 一个非常大的集合,每台机器大约每 10 分钟发送一次 ping。
machines
- 相当小的集合,大约不到 1000 台机器
我需要查询 "Alive" 台机器,即在过去 10 分钟内发送 ping 的所有机器。
目前我的架构如下:
pings = {
_id - ObjectID
machineID - ObjectID
pingTime - ISODate
}
machines = {
_id - ObjectID
name - String
type - string
}
MongoDB 中的数据建模与 SQL 中的数据建模不同。使用 SQL,您可以识别您的实体、它们的属性和它们之间的关系,然后用头撞墙让您的 JOIN 正确回答您的用例中出现的问题。
对于 MongoDB 和 – 在不同程度上 – 其他 NoSQL 数据库,数据建模的工作方式不同:您首先确定用例中出现的问题 ,并相应地对数据建模,以便以最有效的方式回答问题。
让我们假设您有一个 Web 应用程序,您可以在其中看到机器列表,然后单击要获取机器详细信息的单个机器。所以我们有一台我们想要检查的已知机器。这听起来很简单,但在这里很重要。假设您的列表是从您的 machines
模型生成的,您已经掌握了生成机器详细信息视图的所有信息:
db.pings.find({machineID:givenmachine["_id"]})
对于您描述的用例,我会稍微更改 ping
数据模型:
{
_id: new ObjectID(),
machine: "host.example.com",
pingTime: new ISODate()
}
原因:与流行的看法相反,冗余本身并不是坏事。 不必要冗余是。但是您的用例验证了它,因为它使您的查询 much 更有效率:
t = new Date()
t.setMinutes(t.getMinutes() - 10);
db.pings.distinct("machine",{pingTime:{$gte:t}})
在pingTime上有一个索引,速度快如闪电,只涉及一个集合。即使您更改了机器名称,与检查这些机器的启动状态(?)相比,这应该是一个相当罕见的用例。
我是 MongoDB 的新手,在 SQL 方面有很强的背景,不知道设计以下场景的理想方法是什么:
我有一组机器向主机发送 ping,我需要知道哪些机器在过去 10 分钟内发送了 ping。
我有 2 个合集:
pings
- 一个非常大的集合,每台机器大约每 10 分钟发送一次 ping。machines
- 相当小的集合,大约不到 1000 台机器
我需要查询 "Alive" 台机器,即在过去 10 分钟内发送 ping 的所有机器。
目前我的架构如下:
pings = {
_id - ObjectID
machineID - ObjectID
pingTime - ISODate
}
machines = {
_id - ObjectID
name - String
type - string
}
MongoDB 中的数据建模与 SQL 中的数据建模不同。使用 SQL,您可以识别您的实体、它们的属性和它们之间的关系,然后用头撞墙让您的 JOIN 正确回答您的用例中出现的问题。
对于 MongoDB 和 – 在不同程度上 – 其他 NoSQL 数据库,数据建模的工作方式不同:您首先确定用例中出现的问题 ,并相应地对数据建模,以便以最有效的方式回答问题。
让我们假设您有一个 Web 应用程序,您可以在其中看到机器列表,然后单击要获取机器详细信息的单个机器。所以我们有一台我们想要检查的已知机器。这听起来很简单,但在这里很重要。假设您的列表是从您的 machines
模型生成的,您已经掌握了生成机器详细信息视图的所有信息:
db.pings.find({machineID:givenmachine["_id"]})
对于您描述的用例,我会稍微更改 ping
数据模型:
{
_id: new ObjectID(),
machine: "host.example.com",
pingTime: new ISODate()
}
原因:与流行的看法相反,冗余本身并不是坏事。 不必要冗余是。但是您的用例验证了它,因为它使您的查询 much 更有效率:
t = new Date()
t.setMinutes(t.getMinutes() - 10);
db.pings.distinct("machine",{pingTime:{$gte:t}})
在pingTime上有一个索引,速度快如闪电,只涉及一个集合。即使您更改了机器名称,与检查这些机器的启动状态(?)相比,这应该是一个相当罕见的用例。