1

我正在创建一个在线聊天。

上下文(如果需要):

到目前为止,我一直在使用 PHP/MySQL 和 AJAX 来完成这项工作,但这不是一个健康的解决方案,因为我坚持使用“拉式”类型的应用程序,担心可伸缩性。我阅读了有关“推送”方法替代方案的信息,看来我的选择是有限的并且排除了 PHP。如果 Websockets 集成在每个浏览器中,它可能是一个非常有趣的选项,但事实并非如此(似乎对于大多数实现它的人来说,它默认是禁用的)。长轮询也将是一个候选者,但它涉及其他问题,例如并发打开连接的数量也可能会杀死您的 Web 应用程序。

这就是为什么违背我的意愿,我认为我唯一可行的选择是使用服务器端 javascript(node.js + now.js 将是我的选择)。

这就是说,我可能也需要重新考虑数据库的使用。我需要保留每个用户的存储数据并将这些用户链接到他们提交的消息。如果是推送系统驱动的聊天引擎,那么 MySQL 是否仍然是一个有价值的选择?我阅读了有关 NoSQL 数据管理的内容,似乎 MongoDB 将成为 node.js 的一个很好的补充。

我的两个问题:

  1. 如果是实时网络应用程序,我是否有理由更好地迁移到 NoSQL 系统(我需要从头开始学习)而不是 MySQL(我已经知道)?

  2. 假设在 MySQL 中:

    • 我有一个名为 user (user_id_p, username) 的表
    • 我有一个名为messages(message_id,message,user_id_f)的表
    • 我想进行一次查询以获取与用户名“omgtheykilledkenny”相关的所有消息。

    很简单,但是我怎样才能用 MongoDB 及其集合理念来实现呢?

感谢您的帮助。

4

2 回答 2

0
  1. 使用 node.js/MongoDB 很酷,因为 Mongo 的文档结构已经是 JSONish,因此您不必将查询转换为 JSON。如果您已经了解 JavaScript,那么您将在学习 MongoDB 方面处于领先地位。Mongo 确实可以轻松地扩展写入和读取,速度非常棒,尽管我在单个系统上看到了一些与 Mongo 相当的 MySQL 基准测试——当你开始需要多个盒子时,它真的很出色。

  2. 假设您有一个单独的消息集合,并且您已经知道您可以执行的用户 ID:db.messages.find({user_id:ObjectId(...)});

更新:如果您不知道用户 ID,那么您需要进行两次查询,是的(除非您按照另一个答案中的建议使用嵌入式数组——不过,对于这种用例,我建议您不要这样做,因为您最终会查询整个文档/消息列表,甚至只显示一个子集)。根据您的用例,显然,如果您有用户名,您也可以方便地使用用户 ID,以应对此类情况。如果是客户端输入给出的用户名不起作用。

更新 2:如果您有唯一的用户名,您可以将用户名设置为 users 集合的 _id 以避免此问题。大多数人可能会建议不要这样做,它有一些明显的缺点,例如更难更改用户名。

于 2012-04-23T18:24:35.543 回答
0

您无法在 MongoDB 中执行连接,因此您无法实现第二个要求。这样做的 Mongo 方法是将消息嵌套在用户集合中:

{用户名:'abc',消息:[...]}

或者使用 refId,它是连接和嵌套文档之间的一种中途之家:

http://uk3.php.net/manual/en/class.mongodbref.php

在从 MySQL 切换到 Mongo 方面,您不一定需要完全放弃 MySQL。在某些用例中,一个比另一个更合适。如果合适的话,您可以将两者用于系统的不同部分。就个人而言,我过去在很多事情上都使用过 MySQL,目前我正在将 MongoDB 用于一个大项目。我发现移动非常容易,因为它非常容易使用 MongoDB 驱动程序,而且 MongoDB 站点总体上非常适合文档。

您可以使用前端的 json_encode 和 json_decode 与 JSON 进行转换,并使用 MongoDB 的 PHP 驱动程序查询和插入/更新数组,因此它可以说比 MySQL 更直观和更易于使用。这只是习惯的问题。

于 2012-04-23T19:04:02.200 回答