构建一个即时消息应用(一):模式
这是一系列关于构建“即时消息”应用的新帖子。你应该对这类应用并不陌生。有了它们的帮助,我们才可以与朋友畅聊无忌。我们将会用 CockroachDB 作为 SQL 数据库,用 Go 作为后端语言,并且用 JavaScript 来制作 web 应用。
- 作者:Nicolás Parada来源:Linux公社|2019-09-29 15:25
这是一系列关于构建“即时消息”应用的新帖子。你应该对这类应用并不陌生。有了它们的帮助,我们才可以与朋友畅聊无忌。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 conversations
ADD CONSTRAINT fk_last_message_id_ref_messages
FOREIGN 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
这篇帖子就到这里。
点赞 0
- 大家都在看
- 猜你喜欢
编辑推荐
- 24H热文
- 一周话题
- 本月获赞
- 终于有人把Elasticsearch原理讲透了!使用Kotlin做开发一个月后的感想花了一个星期,我终于把RPC框架整明白了!面试官问你什么是消息队列?把这篇甩给他!2019年流行的8种编程语言和框架刚来的大神彻底干掉了代码中的if else...Cookies和Session的区别和理解支付宝架构到底有多牛逼!没看完我就跪了!
- 终于有人把Elasticsearch原理讲透了!面试官问你什么是消息队列?把这篇甩给他!使用Kotlin做开发一个月后的感想花了一个星期,我终于把RPC框架整明白了!支付宝架构到底有多牛逼!没看完我就跪了!收藏 | 第一次有人把“分布式事务”讲的这么简单明了刚来的大神彻底干掉了代码中的if else...2019年流行的8种编程语言和框架
- 终于有人把Elasticsearch原理讲透了!使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!花了一个星期,我终于把RPC框架整明白了!收藏 | 第一次有人把“分布式事务”讲的这么简单明了Java对象为啥要实现Serializable接口?拜托!面试不要再问我Spring Cloud底层原理五大自动化测试的Python框架
订阅专栏+更多
-
中间件安全防护攻略
4类安全防护共4章 | hack_man50人订阅学习
-
CentOS 8 全新学习术
CentOS 8 正式发布共16章 | UbuntuServer266人订阅学习
-
用Python玩转excel
让重复操作傻瓜化共3章 | DE8UG229人订阅学习
视频课程+更多
-
小白轻松学Spring Cloud
讲师:齐毅80434人学习过
-
强哥带你精通zabbix监控
讲师:周玉强11497人学习过
-
c++对象模型探索视频课程
讲师:王健伟25976人学习过
- 精选博文
- 论坛热帖
读 书 +更多
PHP和MySQL Web开发(原书第3版)
本书将介绍如何创建可交互的Web站点,包括从最简单的订单表单到复杂的安全电子商务站点。而且,读者还将了解如何使用开放源代码技术来实现...
-
订阅51CTO邮刊
点击这里查看样刊

51CTO服务号

51CTO官微