邮箱应用程序的数据库设计

Database design for an mailbox app

我正在写一个小应用程序,用 Rails + MySQL,让人们互相发送电子邮件。 为了组织电子邮件,我引入了标签。

我有 table 看起来像:

用户

条消息

messages_users

标签

为了让人们给他们的消息贴上标签,我可以介绍这两个联合 table:

labels_messages_users:

labels_messages

请注意,标签也不一定由用户创建。所以 table labels_messages 中的 user_id 列是必需的。

我不喜欢这种设计。太复杂了,关节table太多了。一定有更优雅的设计。

我想过那些解决方案:

解决方案 #1

条消息

labels_messages

标签 - user_id(fk 给用户) - 姓名

优点:我喜欢这个解决方案,因为它看起来更像一个邮箱系统。简单多了。另外,按标签查询消息更高效。

缺点:我会在收件人和发件人之间复制主题和正文。 (顺便问问GMail是怎么处理的。。。)

解决方案 #2

条消息

message_contents

labels_messages

标签

优点:不再有内容重复。耶!

缺点:设计似乎有问题。如何决定在消息和 message_content 之间设置 fk 的位置?他们互相依赖。

解决方案 #3

条消息

mail_items

labels_mail_items

标签

优点:mail_items 不再是关节 table(所以我可以在我的应用程序中引入新模型)

缺点:实际上仍在搜索...

你能帮我想出更好的解决办法吗? IT 界的大人物(如雅虎邮箱、gmail 等)如何处理这个问题?

谢谢!

编辑:添加了标签 table 并说明了如何将消息映射到标签。

对我来说最清楚的方法如下:

用户

  • 姓名

条消息

  • sender_id(fk 给用户)
  • 主题
  • 正文

message_recipients(要求每封邮件有多个收件人)

  • recipient_id(fk 给用户)
  • message_id(转至消息)

标签

  • 姓名
  • message_id(转至消息)

虽然如果您有一个标签列表可供选择,或者您希望能够显示所有不同的标签,但仅使用名称来标记 table 并使用连接 table 用标签连接消息。

我用了这篇文章:http://web.archive.org/web/20100823114059/http://www.novawave.net/public/rails_messaging_tutorial.html

我创建了一个属于 messageuser 的收据模型。 然后我将 bodysubject 委托给 message。 然后我创建了一个 labels_receipts table 来建立 labelreceipt 之间的 has_and_belongs_to_many 关系。