【发布时间】:2019-08-17 02:19:14
【问题描述】:
我正在为消息传递应用程序设置数据库架构。我有一个消息表,其中存储主题、正文、创建者(发送消息的人的 ID)、状态(已发送、草稿、未读)消息和其他信息,然后我还有一个已发送表来跟踪 messageid(消息表中消息的 id)和 senderid(用户表中发送者的 id)以及跟踪 messageid 和接收者 ID(用户表中接收者的 id)的收件箱表。我想实现以下目标:
- 每次我插入消息表(发布消息)时,我以编程方式将发件人的状态设置为“已发送”,将收件人的状态设置为“未读”,这是否有意义?
- 考虑到前端,默认情况下收件箱中的每条消息都是未读的,所以当它被点击时,它会变成已读,这有意义吗?
- 如何在收件箱表中设置另一个状态,默认情况下,当我为接收者插入收件箱表并在接收者的消息表中“发送”时,该状态将默认为“未读”?
- 如何有效地跟踪 parentmessageid 并使用它来启动线程作为对初始消息的回复?
这就是消息表现在的样子
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()
)`;
注意:我在 stackoverflow 上看到了一些关于类似问题的答案,但我只是好奇我目前的设计将如何工作。
我认为不需要搁置这个问题。 StackOverflow 是一个由专业人士组成的社区,有人问我的问题是想看看我可以实现相同目标的其他更好的方法。这些意见受到赞赏,因为我们可以向任何回答问题的人学习。就目前而言,只有一个人回答了这个问题,那么我们该如何学习呢?
【问题讨论】:
-
“每次我插入消息表(发布消息)时,我以编程方式将发件人的状态设置为“已发送”,这有意义吗?不。什么关于保存草稿?发送仍在进行中?
-
状态应该在另一个表中。然后您将轻松查询具有这种或那种状态的消息,而不是冒着打字错误和重复信息所占用的磁盘空间的风险
-
我赞成你在你的问题中所做的努力,但我投票结束,因为这是基于意见且过于广泛
-
@Cid 是有道理的,但是如何从后端获得草稿状态?
-
这更广泛:D 添加一个保存消息的按钮?