【问题标题】:Database design for a chat system聊天系统的数据库设计
【发布时间】:2017-09-19 06:54:27
【问题描述】:

我知道有很多帖子讨论聊天系统的 Db 设计,但他们没有解释任何关于该设计的可扩展性的信息,所以我的问题在这里。

我想设计一个 2 个或多个用户之间实时聊天的 Db,让我们先以 2 个用户为例,这里是我想出来的。

表 1:

名称:用户

字段:id、名称

表 2

名称:聊天室

字段:id、user1、user2

表 3

姓名:留言

字段:Chat_room_id、user_id、消息

现在考虑 Facebook,它每月有大约 20 亿活跃用户,假设其中有 10 亿沉迷于聊天,每个用户发送 100 条消息。

在表中产生了 1000 亿个条目:消息,所以问题是,

“Mysql 或 Postgres 是否能够处理如此多的条目并实时显示特定的聊天室消息?”如果不是,那么最佳实践应该是什么,我知道这也取决于安装 RDBMS 的服务器,但仍想知道最佳架构。

PS:我使用 Django 作为后端,使用 AngularJs 进行异步行为

【问题讨论】:

  • 看起来设计很差。通常,只要您枚举了列,就可以确定设计存在缺陷。这种情况当然也不例外。
  • 是的,你说得对,这是一个糟糕的设计,这是我的问题,在这种情况下,一个好的设计应该是什么样子?
  • 除此之外,设想的规模完全不成比例。 Facebook 采用多种架构来管理其数据集。当您的竞争对手技术超越 Facebook 时,我相信您要么足够有钱,可以聘请专业人士为您研究这些问题,要么太富有而无法关心。
  • 完全同意你的观点,我不是在竞争 facebook,我是一名学生,所以我想知道我应该使用什么样的技术和工具来完成这项任务,不要假设 1000 亿太多,但让我们拿 1000 万
  • 规范化设计可能有一个 chatroom_participants 表,其中包含一个聊天室列和一个参与者列,每个列中输入一个值,并在组合上形成一个 PRIMARY KEY这两列。

标签: mysql postgresql database-design real-time bigdata


【解决方案1】:

一个表中的 1000 亿行永远不会在线工作。不仅应用了所有可能的分区方式来减小大小,而且还采用了主动/被动数据策略的分离。但尽管如此,所有的高中生,答案是:

Postgres 确实可以有效地处理大数据本身。

然而:

Postgres 没有足够有效的策略来对抗糟糕的设计

看看你的例子:表 chat_room 在不同的列中列出了两个用户 - 有什么用?您在引用 users.id 的消息中有 user_id。而且你有chat_room.id,所以你有哪些用户在那个chat_room中的数据。现在,如果您的想法是预先汇总哪些用户在一段时间内或根本没有参与聊天室,请将其设为一个数组列,例如 (chat_room.id int, users_id bigint[]),或者如果您想要加入时间和离开时间,请添加相应的属性。主动/被动数据可以使用与主动关系不同的存档聊天室来实现。顺便说一句,可以在此类存档上执行谁参与了该聊天室的聚合...

以上不是行动说明,只是表达。数据库模式没有最佳实践。首先明确计划您的聊天将做什么,然后制定数据库模式,尝试,改进,尝试,改进,尝试,改进等等,直到一切正常。如果您担心它将如何处理 1000 亿行 - 请填写并检查...

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2014-02-03
    • 2019-08-17
    • 2017-10-23
    • 2014-10-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多