我正在为消息传递应用程序设置数据库模式。我有一个消息表,用于存储主题,正文,创建者(发送消息的人的ID),状态(已发送,草稿,未读)消息和其他信息,然后我还有一个已发送的表来跟踪messageid(消息表中消息的ID)和发件人ID(用户表中发件人的ID),还有收件箱表,该表跟踪messageid和接收者ID(用户表中收件人的ID)。我要实现以下目标:
这是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是一个由专业人士组成的社区,有人问我一个问题,以寻求其他更好的方法来实现同一目标。感谢大家的意见,因为我们可以从回答问题的任何人那里学习。就目前而言,只有一个人回答了这个问题,那么我们如何学习呢?
答案 0 :(得分:1)
这在很大程度上取决于您想要实现什么,但是您的数据模型对我来说似乎太复杂了。
我只需要一个messages
和一个users
表。每封邮件都有一个发件人和一个收件人(通过外键链接),一个sender_status
(草稿/已发送/ ...)和一个recipient_status
(未读/已读/已删除)。
收件箱和发件箱不必是表,它们是通过查询messages
表来确定的。