邮箱应用程序的数据库设计
Database design for an mailbox app
我正在写一个小应用程序,用 Rails + MySQL,让人们互相发送电子邮件。
为了组织电子邮件,我引入了标签。
我有 table 看起来像:
用户
- 姓名
条消息
- sender_id(fk 给用户)
- 主题
- 正文
messages_users
- recipient_id(fk 给用户)
- message_id(转至消息)
标签
- user_id(fk 给用户,可为空)
- 姓名
为了让人们给他们的消息贴上标签,我可以介绍这两个联合 table:
labels_messages_users:
- messages_users_id(fk 到 messages_users)
- label_id(fk 到标签)
labels_messages
- message_id(转至消息)
- label_id(fk 到标签)
- user_id(fk 给用户)
请注意,标签也不一定由用户创建。所以 table labels_messages 中的 user_id 列是必需的。
我不喜欢这种设计。太复杂了,关节table太多了。一定有更优雅的设计。
我想过那些解决方案:
解决方案 #1
条消息
- recipient_id(fk 给用户)
- 我
- 主题
- 正文
- sender_id(fk 给用户)
labels_messages
- label_id(fk 到标签)
- message_id(转至消息)
标签
- user_id(fk 给用户)
- 姓名
优点:我喜欢这个解决方案,因为它看起来更像一个邮箱系统。简单多了。另外,按标签查询消息更高效。
缺点:我会在收件人和发件人之间复制主题和正文。 (顺便问问GMail是怎么处理的。。。)
解决方案 #2
条消息
- recipient_id(fk 给用户)
- 我
- sender_id(fk 给用户)
- message_content_id(转为 message_contents)
message_contents
- 主题
- 正文
labels_messages
- label_id(fk 到标签)
- message_id(转至消息)
标签
- user_id(fk 给用户,可为空)
- 姓名
优点:不再有内容重复。耶!
缺点:设计似乎有问题。如何决定在消息和 message_content 之间设置 fk 的位置?他们互相依赖。
解决方案 #3
条消息
- sender_id(fk 给用户)
- 主题
- 正文
mail_items
- recipient_id(fk 给用户)
- message_id(转消息)
labels_mail_items
- mail_item_id(转为 mail_items)
- label_id(fk 到标签)
标签
- user_id(fk 给用户,可为空)
- 姓名
优点:mail_items 不再是关节 table(所以我可以在我的应用程序中引入新模型)
缺点:实际上仍在搜索...
你能帮我想出更好的解决办法吗? IT 界的大人物(如雅虎邮箱、gmail 等)如何处理这个问题?
谢谢!
编辑:添加了标签 table 并说明了如何将消息映射到标签。
对我来说最清楚的方法如下:
用户
- 姓名
条消息
- sender_id(fk 给用户)
- 主题
- 正文
message_recipients(要求每封邮件有多个收件人)
- recipient_id(fk 给用户)
- message_id(转至消息)
标签
- 姓名
- message_id(转至消息)
虽然如果您有一个标签列表可供选择,或者您希望能够显示所有不同的标签,但仅使用名称来标记 table 并使用连接 table 用标签连接消息。
我创建了一个属于 message
和 user
的收据模型。
然后我将 body
和 subject
委托给 message
。
然后我创建了一个 labels_receipts table 来建立 label
和 receipt
之间的 has_and_belongs_to_many 关系。
我正在写一个小应用程序,用 Rails + MySQL,让人们互相发送电子邮件。 为了组织电子邮件,我引入了标签。
我有 table 看起来像:
用户
- 姓名
条消息
- sender_id(fk 给用户)
- 主题
- 正文
messages_users
- recipient_id(fk 给用户)
- message_id(转至消息)
标签
- user_id(fk 给用户,可为空)
- 姓名
为了让人们给他们的消息贴上标签,我可以介绍这两个联合 table:
labels_messages_users:
- messages_users_id(fk 到 messages_users)
- label_id(fk 到标签)
labels_messages
- message_id(转至消息)
- label_id(fk 到标签)
- user_id(fk 给用户)
请注意,标签也不一定由用户创建。所以 table labels_messages 中的 user_id 列是必需的。
我不喜欢这种设计。太复杂了,关节table太多了。一定有更优雅的设计。
我想过那些解决方案:
解决方案 #1
条消息
- recipient_id(fk 给用户)
- 我
- 主题
- 正文
- sender_id(fk 给用户)
labels_messages
- label_id(fk 到标签)
- message_id(转至消息)
标签 - user_id(fk 给用户) - 姓名
优点:我喜欢这个解决方案,因为它看起来更像一个邮箱系统。简单多了。另外,按标签查询消息更高效。
缺点:我会在收件人和发件人之间复制主题和正文。 (顺便问问GMail是怎么处理的。。。)
解决方案 #2
条消息
- recipient_id(fk 给用户)
- 我
- sender_id(fk 给用户)
- message_content_id(转为 message_contents)
message_contents
- 主题
- 正文
labels_messages
- label_id(fk 到标签)
- message_id(转至消息)
标签
- user_id(fk 给用户,可为空)
- 姓名
优点:不再有内容重复。耶!
缺点:设计似乎有问题。如何决定在消息和 message_content 之间设置 fk 的位置?他们互相依赖。
解决方案 #3
条消息
- sender_id(fk 给用户)
- 主题
- 正文
mail_items
- recipient_id(fk 给用户)
- message_id(转消息)
labels_mail_items
- mail_item_id(转为 mail_items)
- label_id(fk 到标签)
标签
- user_id(fk 给用户,可为空)
- 姓名
优点:mail_items 不再是关节 table(所以我可以在我的应用程序中引入新模型)
缺点:实际上仍在搜索...
你能帮我想出更好的解决办法吗? IT 界的大人物(如雅虎邮箱、gmail 等)如何处理这个问题?
谢谢!
编辑:添加了标签 table 并说明了如何将消息映射到标签。
对我来说最清楚的方法如下:
用户
- 姓名
条消息
- sender_id(fk 给用户)
- 主题
- 正文
message_recipients(要求每封邮件有多个收件人)
- recipient_id(fk 给用户)
- message_id(转至消息)
标签
- 姓名
- message_id(转至消息)
虽然如果您有一个标签列表可供选择,或者您希望能够显示所有不同的标签,但仅使用名称来标记 table 并使用连接 table 用标签连接消息。
我创建了一个属于 message
和 user
的收据模型。
然后我将 body
和 subject
委托给 message
。
然后我创建了一个 labels_receipts table 来建立 label
和 receipt
之间的 has_and_belongs_to_many 关系。