将消息传递模式移动到MongoDB
我使用此模式支持站点内消息传递: 当我向其他成员发送消息时,消息将保存到消息表中;记录被添加到MessageSent表中,每个收件人的记录被添加到MessageInbox表中。MessageCount用于跟踪inbox/send文件夹中的邮件数量,并使用MessageInbox/MessageSent上的插入/删除触发器填充—这样,我就可以随时知道成员有多少封邮件,而无需进行昂贵的“select count(*)查询 另外,当我查询成员的消息时,我加入到成员表中以获取成员的名字/姓氏 现在,我将把应用程序移到MongoDB,我不太确定集合模式应该是什么。因为MongoDB中没有可用的连接,所以我必须对其进行完全的非规范化,所以我会使用MessageInbox、MessageDraft和MessageSent集合来提供完整的消息信息,对吗 那么我不确定以下几点:将消息传递模式移动到MongoDB,mongodb,schema,messaging,Mongodb,Schema,Messaging,我使用此模式支持站点内消息传递: 当我向其他成员发送消息时,消息将保存到消息表中;记录被添加到MessageSent表中,每个收件人的记录被添加到MessageInbox表中。MessageCount用于跟踪inbox/send文件夹中的邮件数量,并使用MessageInbox/MessageSent上的插入/删除触发器填充—这样,我就可以随时知道成员有多少封邮件,而无需进行昂贵的“select count(*)查询 另外,当我查询成员的消息时,我加入到成员表中以获取成员的名字/姓氏 现在,我
非常感谢您的任何想法、意见和建议 关于我在MongoDB中模拟连接所做的工作,我可以为您提供一些见解 在这种情况下,我将相应用户(或多个用户)的ID存储在给定对象中,例如messages集合中的message对象 (我不是建议这是你的模式,只是用它作为我方法的一个例子) 我将查询数据库以获取我需要的所有消息,然后在我的应用程序中迭代结果并构建一个用户ID数组。我会过滤这个数组使其唯一,然后使用
$in
操作符再次查询数据库,以查找给定数组中的任何用户
然后在我的应用程序中,我将把结果连接回对象
它需要对数据库进行两次查询(如果您想加入其他集合,可能需要进行更多查询),但这说明了许多人长期以来一直提倡的一点:在应用程序层中进行连接。让数据库花时间查询数据,而不是处理数据。无论如何,您可以比数据库更快、更便宜地扩展应用程序服务器
我正在使用这种模式在我的应用程序中创建实时活动提要,它可以完美快速地工作。我更喜欢这样做,而不是去规范化可能会改变的东西,比如用户信息,因为在写入数据库时,如果新数据不适合旧数据,MongoDB可能需要重新写入整个对象。如果我需要重写数据库中数百(或数千)个活动项,那么这将是一场灾难
此外,MongoDB上的写操作是阻塞的,因此如果发生我刚才描述的场景,所有读写操作都将被阻塞,直到写操作完成。我相信这将在2.x系列中以一定的容量得到解决,但它仍然不是完美的
另一方面,索引查询速度非常快,即使您需要执行其中两项来获取数据。我可以为您提供一些关于我在MongoDB中模拟联接所做工作的见解 在这种情况下,我将相应用户(或多个用户)的ID存储在给定对象中,例如messages集合中的message对象 (我不是建议这是你的模式,只是用它作为我方法的一个例子) 我将查询数据库以获取我需要的所有消息,然后在我的应用程序中迭代结果并构建一个用户ID数组。我会过滤这个数组使其唯一,然后使用
$in
操作符再次查询数据库,以查找给定数组中的任何用户
然后在我的应用程序中,我将把结果连接回对象
它需要对数据库进行两次查询(如果您想加入其他集合,可能需要进行更多查询),但这说明了许多人长期以来一直提倡的一点:在应用程序层中进行连接。让数据库花时间查询数据,而不是处理数据。无论如何,您可以比数据库更快、更便宜地扩展应用程序服务器
我正在使用这种模式在我的应用程序中创建实时活动提要,它可以完美快速地工作。我更喜欢这样做,而不是去规范化可能会改变的东西,比如用户信息,因为在写入数据库时,如果新数据不适合旧数据,MongoDB可能需要重新写入整个对象。如果我需要重写数据库中数百(或数千)个活动项,那么这将是一场灾难
此外,MongoDB上的写操作是阻塞的,因此如果发生我刚才描述的场景,所有读写操作都将被阻塞,直到写操作完成。我相信这将在2.x系列中以一定的容量得到解决,但它仍然不是完美的
另一方面,索引查询速度非常快,即使您需要执行其中两项来获取数据。这是个好主意。有没有想过以一种有效的方式收集消息计数?最好的方法可能是将预先计算的计数存储在某个地方。MongoDB 2.x计划增加一些聚合操作符,比如$sum,但目前还没有。对于类似的事情,您可能只想将其存储在某个地方,并在发送消息时使用$inc操作符增加它。这是一个好主意。有没有想过以一种有效的方式收集消息计数?最好的方法可能是将预先计算的计数存储在某个地方。MongoDB 2.x计划有额外的聚合操作符,比如$sum,但是
{
_id: "msg1234",
from: "user1234",
to: "user5678",
subject: "This is the subject",
body: "This is the body"
}