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

时间:2015-08-10 23:58:45

标签: mysql ruby-on-rails database database-design

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

我的表格看起来像:

用户

  • 名称

讯息

  • sender_id(fk to users)
  • 受试者

messages_users

  • recipient_id(fk to users)
  • message_id(fk to messages)

标签

  • user_id(fk to users,nullable)
  • 名称

为了让人们在他们的消息中应用标签,我可以介绍这两个联合表中的一个:

labels_messages_users

  • messages_users_id(fk to messages_users)
  • label_id(fk to labels)

labels_messages

  • message_id(fk to messages)
  • label_id(fk to labels)
  • user_id(fk to users)

请注意,标签不一定由用户创建。因此,必须使用表labels_messages中的user_id列。

我不是这种设计的粉丝。它太复杂了,关节表太多了。必须有一个更优雅的设计。

我想到了那些解决方案:

解决方案#1

讯息

  • recipient_id(fk to users)
  • 受试者
  • sender_id(fk to users)

labels_messages

  • label_id(fk to labels)
  • message_id(fk to messages)

标签 - user_id(fk to users) - 姓名

优点:我喜欢这个解决方案,因为它看起来更像邮箱系统。更简单。此外,通过标签查询邮件更有效。

缺点:我将在收件人和发件人之间复制主题和正文。 (我想知道GMail如何处理这种情况......)

解决方案#2

讯息

  • recipient_id(fk to users)
  • sender_id(fk to users)
  • message_content_id(fk to message_contents)

message_contents

  • 受试者

labels_messages

  • label_id(fk to labels)
  • message_id(fk to messages)

标签

  • user_id(fk to users,nullable)
  • 名称

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

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

解决方案#3

讯息

  • sender_id(fk to users)
  • 受试者

mail_items

  • recipient_id(fk to users)
  • message_id(fk to message)

labels_mail_items

  • mail_item_id(fk to mail_items)
  • label_id(fk to labels)

标签

  • user_id(fk to users,nullable)
  • 名称

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

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

你能帮我提出一个更好的解决方案吗? IT中的大家伙(如雅虎邮箱,gmail和所有人)如何处理这个问题?

谢谢!

编辑:添加标签表并说明如何将邮件映射到标签。

1 个答案:

答案 0 :(得分:0)

对我而言,最明确的方式如下:

用户

  • 名称

消息

  • sender_id(fk to users)
  • 受试者

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

  • recipient_id(fk to users)
  • message_id(fk to message)

标签

  • 名称
  • message_id(fk to message)

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