构建一个即时消息应用(一):模式 | Linux 中国

2019 年 9 月 28 日 Linux中国
这是一系列关于构建“即时消息”应用的新帖子。
-- Nicolás Parada

这是一系列关于构建“即时消息”应用的新帖子。你应该对这类应用并不陌生。有了它们的帮助,我们才可以与朋友畅聊无忌。Facebook MessengerWhatsApp 和 Skype 就是其中的几个例子。正如你所看到的那样,这些应用允许我们发送图片、传输视频、录制音频、以及和一大帮子人聊天等等。当然,我们的教程应用将会尽量保持简单,只在两个用户之间发送文本消息。

我们将会用 CockroachDB 作为 SQL 数据库,用 Go 作为后端语言,并且用 JavaScript 来制作 web 应用。

这是第一篇帖子,我们将会讲述数据库的设计。

   
   
     
  1. CREATE TABLE users (
  2. id SERIAL NOT NULL PRIMARY KEY,
  3. username STRING NOT NULL UNIQUE,
  4. avatar_url STRING,
  5. github_id INT NOT NULL UNIQUE
  6. );

显然,这个应用需要一些用户。我们这里采用社交登录的形式。由于我选用了 GitHub,所以这里需要保存一个对 GitHub 用户 ID 的引用。

   
   
     
  1. CREATE TABLE conversations (
  2. id SERIAL NOT NULL PRIMARY KEY,
  3. last_message_id INT,
  4. INDEX (last_message_id DESC)
  5. );

每个对话都会引用最近一条消息。每当我们输入一条新消息时,我们都会更新这个字段。我会在后面添加外键约束。

… 你可能会想,我们可以先对对话进行分组,然后再通过这样的方式获取最近一条消息。但这样做会使查询变得更加复杂。

   
   
     
  1. CREATE TABLE participants (
  2. user_id INT NOT NULL REFERENCES users ON DELETE CASCADE,
  3. conversation_id INT NOT NULL REFERENCES conversations ON DELETE CASCADE,
  4. messages_read_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  5. PRIMARY KEY (user_id, conversation_id)
  6. );

尽管之前我提到过对话只会在两个用户之间进行,但我们还是采用了允许向对话中添加多个参与者的设计。因此,在对话和用户之间有一个参与者表。

为了知道用户是否有未读消息,我们在消息表中添加了“读取时间”(messages_read_at)字段。每当用户在对话中读取消息时,我们都会更新它的值,这样一来,我们就可以将它与对话中最后一条消息的“创建时间”(created_at)字段进行比较。

   
   
     
  1. CREATE TABLE messages (
  2. id SERIAL NOT NULL PRIMARY KEY,
  3. content STRING NOT NULL,
  4. user_id INT NOT NULL REFERENCES users ON DELETE CASCADE,
  5. conversation_id INT NOT NULL REFERENCES conversations ON DELETE CASCADE,
  6. created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
  7. INDEX(created_at DESC)
  8. );

尽管我们将消息表放在最后,但它在应用中相当重要。我们用它来保存对创建它的用户以及它所出现的对话的引用。而且还可以根据“创建时间”(created_at)来创建索引以完成对消息的排序。

   
   
     
  1. ALTER TABLE conversations
  2. ADD CONSTRAINT fk_last_message_id_ref_messages
  3. FOREIGN KEY (last_message_id) REFERENCES messages ON DELETE SET NULL;

我在前面已经提到过这个外键约束了,不是吗:D

有这四张表就足够了。你也可以将这些查询保存到一个文件中,并将其通过管道传送到 Cockroach CLI。

首先,我们需要启动一个新节点:

   
   
     
  1. cockroach start --insecure --host 127.0.0.1

然后创建数据库和这些表:

   
   
     
  1. cockroach sql --insecure -e "CREATE DATABASE messenger"
  2. cat schema.sql | cockroach sql --insecure -d messenger

这篇帖子就到这里。在接下来的部分中,我们将会介绍「登录」,敬请期待。

◈  源代码


via: https://nicolasparada.netlify.com/posts/go-messenger-schema/

作者:Nicolás Parada 选题:lujun9972 译者:PsiACE 校对:wxy

本文由 LCTT 原创编译,Linux 中国 荣誉推出

😻:还 在看吗?


登录查看更多
0

相关内容

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。
【Manning新书】现代Java实战,592页pdf
专知会员服务
98+阅读 · 2020年5月22日
【SIGMOD2020-腾讯】Web规模本体可扩展构建
专知会员服务
29+阅读 · 2020年4月12日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
【2020新书】Kafka实战:Kafka in Action,209页pdf
专知会员服务
65+阅读 · 2020年3月9日
[综述]深度学习下的场景文本检测与识别
专知会员服务
77+阅读 · 2019年10月10日
5大必知的图算法,附Python代码实现
AI100
4+阅读 · 2019年9月10日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
I2P - 适用于黑客的Android应用程序
黑白之道
28+阅读 · 2019年3月6日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
精进 | BooNik使用人工智能生成有趣的东西
商业周刊中文版
3+阅读 · 2018年6月5日
如何运用Python建一个聊天机器人?
七月在线实验室
17+阅读 · 2018年1月23日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
别@微信团队了,我用Python给自己戴上了圣诞帽!
Tensorflow 文本分类-Python深度学习
Python程序员
12+阅读 · 2017年11月22日
Arxiv
6+阅读 · 2020年2月15日
Arxiv
26+阅读 · 2018年9月21日
VIP会员
相关VIP内容
【Manning新书】现代Java实战,592页pdf
专知会员服务
98+阅读 · 2020年5月22日
【SIGMOD2020-腾讯】Web规模本体可扩展构建
专知会员服务
29+阅读 · 2020年4月12日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
【2020新书】Kafka实战:Kafka in Action,209页pdf
专知会员服务
65+阅读 · 2020年3月9日
[综述]深度学习下的场景文本检测与识别
专知会员服务
77+阅读 · 2019年10月10日
相关资讯
5大必知的图算法,附Python代码实现
AI100
4+阅读 · 2019年9月10日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
I2P - 适用于黑客的Android应用程序
黑白之道
28+阅读 · 2019年3月6日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
精进 | BooNik使用人工智能生成有趣的东西
商业周刊中文版
3+阅读 · 2018年6月5日
如何运用Python建一个聊天机器人?
七月在线实验室
17+阅读 · 2018年1月23日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
别@微信团队了,我用Python给自己戴上了圣诞帽!
Tensorflow 文本分类-Python深度学习
Python程序员
12+阅读 · 2017年11月22日
Top
微信扫码咨询专知VIP会员