如何使用当前的架构设计有效地设计消息传递系统?

时间:2019-03-26 16:06:56

标签: postgresql data-modeling

我正在为消息传递应用程序设置数据库模式。我有一个消息表,用于存储主题,正文,创建者(发送消息的人的ID),状态(已发送,草稿,未读)消息和其他信息,然后我还有一个已发送的表来跟踪messageid(消息表中消息的ID)和发件人ID(用户表中发件人的ID),还有收件箱表,该表跟踪messageid和接收者ID(用户表中收件人的ID)。我要实现以下目标:

  • 每次插入消息表(发布消息)时,以编程方式将发送者的状态设置为“已发送”,接收者的状态设置为“未读”是否有意义?
  • 考虑到前端,默认情况下收件箱中的每封邮件都未读是否有意义,因此当单击该邮件时,它就会变为已读?
  • 如何在收件箱表中设置其他状态,默认情况下,当我将其插入收件人的收件箱表并在收件人的消息表中“发送”时,该状态默认为“未读”?
  • 如何有效跟踪parentmessageid并使用它来启动线程以回复初始消息?

这是message表现在的外观

CREATE TABLE messages (
  id SERIAL PRIMARY KEY NOT NULL,
  subject CHARACTER VARYING(255) NOT NULL,
  message CHARACTER VARYING(500) NOT NULL,
  parentmessageid INTEGER NULL,
  creator INTEGER NOT NULL,
  FOREIGN KEY (parentmessageid) references messages (id) on delete CASCADE,
  FOREIGN KEY (creator) references users (id) on DELETE CASCADE,
  status CHARACTER VARYING(50) NOT NULL,
  createdon TIMESTAMP WITH TIME ZONE DEFAULT now()
)`;

收件箱表:

CREATE TABLE inbox (
  id SERIAL PRIMARY KEY NOT NULL,
  messageid INTEGER NOT NULL,
  receiverid INTEGER NOT NULL,
  FOREIGN KEY (messageid) REFERENCES messages (id) on DELETE CASCADE,
  FOREIGN KEY (receiverid) REFERENCES users (id) on DELETE CASCADE,
  createdon TIMESTAMP WITH TIME ZONE DEFAULT now()
)`;

发送的表格:

CREATE TABLE sent (
  id SERIAL PRIMARY KEY NOT NULL,
  messageid INTEGER NOT NULL,
  senderid INTEGER NOT NULL,
  FOREIGN KEY (messageid) REFERENCES messages (id) on DELETE CASCADE,
  FOREIGN KEY (senderid) REFERENCES users (id) on DELETE CASCADE,
  createdon TIMESTAMP WITH TIME ZONE DEFAULT now()
)`;

N.B:我已经在stackoverflow上看到了一些类似问题的答案,但我只是好奇我现在的设计将如何工作。

我认为这个问题不必搁置。 StackOverflow是一个由专业人士组成的社区,有人问我一个问题,以寻求其他更好的方法来实现同一目标。感谢大家的意见,因为我们可以从回答问题的任何人那里学习。就目前而言,只有一个人回答了这个问题,那么我们如何学习呢?

1 个答案:

答案 0 :(得分:1)

这在很大程度上取决于您想要实现什么,但是您的数据模型对我来说似乎太复杂了。

我只需要一个messages和一个users表。每封邮件都有一个发件人和一个收件人(通过外键链接),一个sender_status(草稿/已发送/ ...)和一个recipient_status(未读/已读/已删除)。

收件箱和发件箱不必是表,它们是通过查询messages表来确定的。