这是关于构建即时消息应用程序的新系列博文。您应该熟悉这种类型的应用程序。在他们的帮助下,我们可以与朋友畅谈无阻。FacebookMessenger、WhatsApp和Skype就是其中的几个例子。如您所见,这些应用程序允许我们发送图片、流式传输视频、录制音频、与一大群人聊天等等。当然,我们的教程应用程序将尽可能简单,只是在两个用户之间发送文本消息。我们将使用CockroachDB作为SQL数据库,使用Go作为后端语言,并使用JavaScript作为Web应用程序。在第一篇文章中,我们将介绍数据库设计。创建表用户(idSERIALNOTNULLPRIMARYKEY,usernameSTRINGNOTNULLUNIQUE,avatar_urlSTRING,github_idINTNOTNULLUNIQUE);显然,这个应用程序需要一些用户。我们这里使用社交登录的形式。由于我选择了GitHub,因此我需要在此处保存对我的GitHub用户ID的引用。创建表对话(idSERIALNOTNULLPRIMARYKEY,last_message_idINT,INDEX(last_message_idDESC));每个对话都将引用最近的消息。每次输入新消息时,我们都会更新此字段。稍后我将添加外键约束。……您可能认为我们可以先将对话分组,然后以这种方式获取最新消息。但是这样做会使查询更加复杂。CREATETABLEparticipants(user_idINTNOTNULLREFERENCESusersONDELETECASCADE,conversation_idINTNOTNULLREFERENCESconversationsONDELETECASCADE,messages_read_atTIMESTAMPTZNOTNULLDEFAULTnow(),PRIMARYKEY(虽然我之前只提到过对话)convers;将在两个用户之间,但我们有一个设计,允许将多个参与者添加到对话中。因此,在对话和用户之间有一个参与者表。为了知道用户是否有未读消息,我们添加了一个“阅读时间”(messages_read_at)字段添加到消息表。每次用户阅读对话中的消息时,我们都会更新它的值,因此我们可以将它与对话中最后一条消息的“created_at”字段进行比较。CREATETABLEmessages(idSERIALNOTNULLPRIMARYKEY,内容STRINGNOTNULL,user_idINTNOTNULLREFERENCESDELETECASCADE用户,conversation_idINTNOTNULLREFERENCESDELETECASCADE对话,created_atTIMESTAMPTZNOTNULLDEFAULTnow(),INDEX(created_atDESC));虽然我们把消息表放在了最后,但是它在应用中是相当重要的。我们用它来保存创建它的用户和它出现的对话的引用。你也可以根据“created_at”创建一个索引来完成消息的排序。ALTERTABLEconversationsADDCONSTRAINTfk_last_message_id_ref_messagesFOREIGNKEY(last_message_id)REFERENCES消息ONDELETESETNULL;我之前已经提到过这个外键约束,我不是吗:D这四个表就足够了。您还可以将这些查询保存到一个文件中,并将其通过管道传输到CockroachCLI。首先,我们需要启动一个新节点:cockroachstart--insecure--host127.0.0.1然后创建数据库和这些表:cockroachsql--insecure-e"CREATEDATABASEmessenger"catschema.sql|cockroachsql--insecure-这就是dMessenger上这篇文章的全部内容。
