电子邮件或私人消息的良好数据库设计

时间:2010-10-27 09:31:52

标签: database-design

目前,我正在为我的网站使用消息系统。该消息用于在站点成员之间发送消息。它也可以用来发送友情邀请等。但是,我还没有找到一个好的数据库设计。我希望消息系统使用线程样式,就像电子邮件一样。但由于我不是复杂数据库设计专家,我无法知道如何做到这一点。

到目前为止,这是我的设计,

CREATE TABLE messages (
  message_id            BIGINT      PRIMARY KEY,
  message_date_time     TIMESTAMP   DEFAULT NOW(),
  message_subject       TEXT,
  message_body          TEXT,
  message_attachment    TEXT, -- path to attachment folder
  message_sender_id     INT, -- FK to table user
  message_sender_status INT, -- 0 = deleted by sender, 1=default (can be seen on sender outbox)
);

和另一张桌子......

CREATE TABLE message_recipients (
  message_id               BIGINT, -- FK to table messages
  message_recipient_id     INT,    -- FK to table user
  message_recipient_status INT,    -- 0=deleted from recipient inbox, 1=new message, 2=read
);

我相信我需要另一个表来存储消息之间的链接,这就是为什么我需要这些

CREATE TABLE message_reply (
  message_id        BIGINT, -- FK to table messages
  message_to_reply  BIGINT, -- FK to table messages
);

但是这些表只会让我很难在我的PHP页面上查询和处理。 我只希望用户可以观察源电子邮件和回复(如GMAIL或Facebook的Wall)......
还有更好的建议吗?

  

其他说明

我想要   消息可以发送给很多人   接受者。但一旦它发送,它不能   被修改。假设我发了一个   消息到X,Y和Z.当X回复时,   在我的X中会有来自X的消息   收件箱。如果Z回复,会有一个   来自我收件箱中Z的消息,同样如此   带有X的主语(例如RE:我的主语   第一封邮件)。当我选择X的时候   消息,会有X的消息,   然后是我的第一条消息。如果我   选择发送X回复,X会   收到包含我回复的邮件,   她的回复和我的第一条消息。   我是否回复Z或Z再回复我,   这将是X. X的另一个问题   看不出Z写的东西   另一方面,Z看不到了   我和X之间的谈话。   复杂的不是吗?这就是我的原因   因为这些而死亡的边缘   物。叹气-_-,

     



谢谢你 贝

1 个答案:

答案 0 :(得分:1)

如果邮件由1个人发送且仅由1个人收到,则您不需要您执行的链接表:

message
- message_id
- recipient_id -> links to user.user_id
- sender_id -> links to user.user_id

user
- userid

如果邮件可以是对另一条邮件的回复,只需在邮件本身添加一个字段即可表明它是对以下内容的回复:

message
- parent_id -> message.message_id, or null if it isn't a reply.

这是一个非常简单的设置,如果你要扩展它,它不是最佳的,但这非常简单。