您现在的位置是:亿华云 > 数据库
构建一个即时消息应用(一):模式
亿华云2025-10-09 12:57:23【数据库】2人已围观
简介这是一系列关于构建“即时消息”应用的新帖子。你应该对这类应用并不陌生。有了它们的帮助,我们才可以与朋友畅聊无忌。Facebook Messenger、WhatsApp 和 Skype 就是其中的几个例
这是构建个即一系列关于构建“即时消息”应用的新帖子。你应该对这类应用并不陌生。时消式有了它们的用模帮助,我们才可以与朋友畅聊无忌。构建个即Facebook Messenger、时消式WhatsApp 和 Skype 就是用模其中的几个例子。正如你所看到的构建个即那样,这些应用允许我们发送图片、时消式传输视频、用模录制音频、构建个即以及和一大帮子人聊天等等。时消式当然,用模我们的构建个即教程应用将会尽量保持简单,只在两个用户之间发送文本消息。时消式
我们将会用 CockroachDB 作为 SQL 数据库,用模用 Go 作为后端语言,并且用 JavaScript 来制作 web 应用。
这是头篇帖子,高防服务器我们将会讲述数据库的设计。
CREATE TABLE users ( id SERIAL NOT NULL PRIMARY KEY, username STRING NOT NULL UNIQUE, avatar_url STRING, github_id INT NOT NULL UNIQUE);显然,这个应用需要一些用户。我们这里采用社交登录的形式。由于我选用了 GitHub,所以这里需要保存一个对 GitHub 用户 ID 的引用。
CREATE TABLE conversations ( id SERIAL NOT NULL PRIMARY KEY, last_message_id INT, INDEX (last_message_id DESC));每个对话都会引用最近一条消息。每当我们输入一条新消息时,我们都会更新这个字段。我会在后面添加外键约束。
… 你可能会想,我们可以先对对话进行分组,然后再通过这样的方式获取最近一条消息。但这样做会使查询变得更加复杂。
CREATE TABLE participants ( user_id INT NOT NULL REFERENCES users ON DELETE CASCADE, conversation_id INT NOT NULL REFERENCES conversations ON DELETE CASCADE, messages_read_at TIMESTAMPTZ NOT NULL DEFAULT now(), PRIMARY KEY (user_id, conversation_id));尽管之前我提到过对话只会在两个用户之间进行,但我们还是采用了允许向对话中添加多个参与者的设计。因此,在对话和用户之间有一个参与者表。
为了知道用户是站群服务器否有未读消息,我们在消息表中添加了“读取时间”(messages_read_at)字段。每当用户在对话中读取消息时,我们都会更新它的值,这样一来,我们就可以将它与对话中末尾一条消息的“创建时间”(created_at)字段进行比较。
CREATE TABLE messages ( id SERIAL NOT NULL PRIMARY KEY, content STRING NOT NULL, user_id INT NOT NULL REFERENCES users ON DELETE CASCADE, conversation_id INT NOT NULL REFERENCES conversations ON DELETE CASCADE, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), INDEX(created_at DESC));尽管我们将消息表放在末尾,但它在应用中相当重要。我们用它来保存对创建它的用户以及它所出现的对话的引用。而且还可以根据“创建时间”(created_at)来创建索引以完成对消息的排序。
ALTER TABLE conversationsADD CONSTRAINT fk_last_message_id_ref_messagesFOREIGN KEY (last_message_id) REFERENCES messages ON DELETE SET NULL;我在前面已经提到过这个外键约束了,不是吗:D
有这四张表就足够了。你也可以将这些查询保存到一个文件中,并将其通过管道传送到 Cockroach CLI。
首先,我们需要启动一个新节点:
cockroach start --insecure --host 127.0.0.1然后创建数据库和这些表:
cockroach sql --insecure -e "CREATE DATABASE messenger"cat schema.sql | cockroach sql --insecure -d messenger这篇帖子就到这里。
很赞哦!(9685)
相关文章
- 4、域名传输时,取决于域名原始用户的邮箱是否有效,以及他是否将密码发送到此邮箱。
- 手绘六张图彻底搞懂动态代理
- Go 函数的 Map 型参数,会发生扩容后指向不同底层内存的事儿吗?
- 事务、隔离级别和并发一致性问题
- 解析之后一般在十分钟内生效,如果没有生效可以联系域名服务商进行沟通。
- 推荐几款好用的MySQL开源客户端,建议收藏
- 事务、隔离级别和并发一致性问题
- 手把手教你开展 Mofish 库(摸鱼库)的打包发布
- 在数以亿计的网站中,我们应该抓住每一个可能带来宣传的机会,域名可以带有企业的名字,一般可以使用汉语拼音或者英语单词或者是相关缩写的形式,只要用户记住了你企业的名字,就能很容易的打出你的网站域名,同样的,记住了网站域名也能很快的记住你公司的名字。
- SpringBoot中处理校验逻辑的两种方式,真的很机智!
站长推荐
2、定期提交和投标域名注册。例如,益华网络点击“立即预订”后,平台会抢先为客户注册域名。当然,一个域名可能会被多个客户预订,所以出价最高的人中标。
PostgreSQL痛点的解决方案
如何使用 Spring 和 RabbitMQ 创建一个简单的发布和订阅应用程序?
百亿流量全链路99.99%高可用架构优秀实践
域名资源有限,好域名更是有限,但机会随时都有,这取决于我们能否抓住机会。一般观点认为,国内域名注册太深,建议优先考虑外国注册人。外国注册人相对诚实,但价格差别很大,从几美元到几十美元不等。域名投资者应抓住机遇,尽早注册国外域名。
移动环境中防止数据丢失的5种方法
从MySQL 5.1升级到MariaDB 5.5.x
Jpa 中怎么玩一对多?