美文网首页Linux中国::开源热点 Linux中国::技术专栏
构建一个即时消息应用(一):模式

构建一个即时消息应用(一):模式

作者: Linux技术 | 来源:发表于2019-09-28 22:16 被阅读0次

这是一系列关于构建“即时消息”应用的新帖子。你应该对这类应用并不陌生。有了它们的帮助,我们才可以与朋友畅聊无忌。Facebook MessengerWhatsApp 和 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

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

源代码

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

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

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

相关文章

  • 构建一个即时消息应用(一):模式

    这是一系列关于构建“即时消息”应用的新帖子。你应该对这类应用并不陌生。有了它们的帮助,我们才可以与朋友畅聊无忌。F...

  • 构建一个即时消息应用(二):OAuth

    上一篇:模式。 在这篇帖子中,我们将会通过为应用添加社交登录功能进入后端开发。 社交登录的工作方式十分简单:用户点...

  • 第13章 好菜每回味不同--建造者模式

    建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示,需要应用一个设计模式,建造者...

  • 使用蓝图构建Flask项目目录

    蓝图构建项目目录 什么是蓝图 一个应用中或跨应用制作应用组件和支持通用的模式 蓝图的作用 将不同的功能模块化 构建...

  • Jenkins-通知

    Jenkins的通知方式非常多,具体如下: 电子邮件通知 声明构建 RSS订阅 构建分发器 即时消息 IRC通知 ...

  • 搭建React开发环境

    构建React应用 构建React应用使用官网推荐的creat-reacr-app来构建一个react应用,也有其...

  • 07.构建者模式(创建型)

    创建型模式-构建者模式(生成器模式) 构建者模式为客户返回一个由多个部件组成的复杂产品。 一、构建者模式相关定义 ...

  • 【Flask微电影】02.使用蓝图构建项目目录

    蓝图构建项目目录 什么是蓝图 一个应用中或者跨应用制作应用组件和支持通用的模式 蓝图的作用 将不同的功能模块化 构...

  • 建造者模式(Builder Pattern)

    Builder模式,建造者模式,构建器模式,生成器模式 意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过...

  • docker镜像使用经验心得

    使用官方的基础镜像来构建应用 不要使用从整个操作系统从头安装的模式来构建应用,比如我们使用node环境的时候,我们...

网友评论

    本文标题:构建一个即时消息应用(一):模式

    本文链接:https://www.haomeiwen.com/subject/bjcxpctx.html