MYSQL-为一个用户存储多个电子邮件/地址的最佳设计

时间:2013-06-14 17:21:04

标签: mysql database-design normalization composite-primary-key

我检查了这个问题here,但遗憾的是图表的链接没有工作,所以我被卡住了。

我正在尝试为一个用户(工作,商业,个人等)发送多封电子邮件,我不确定如何最好地处理这种情况。

我想要有4个表:user,email,email_type和user_has_email(用户N:M电子邮件)。 我制作了两张图,但我不知道哪一张更好。

如果一个用户为工作和个人提供相同的电子邮件,那么第一张图可以帮助我(因为我不需要存储两次)。第二个选项也很好,但即使一个用户使用相同的电子邮件进行工作,业务,个人等,我也必须存储两次或更多的电子邮件。

我打算使用相同的想法来存储地址,这比电子邮件占用更多空间,我认为图1 更适合这个。< / p>

您怎么看?

图1
- user_has_email的解释:我选择制作email_type PK,因为可能存在用户拥有相同的工作或个人电子邮件的情况。如果我不PK电子邮件类型,我每个用户只能有一个email_type。我把它弄得太复杂了吗?

Diagram 1


图2 Diagram 2

3 个答案:

答案 0 :(得分:3)

相反,我会使用

user (user_id, first_name, last_name)
user_emails (user_id, email_type_id, email)
email_types (email_type_id, email_type)

答案 1 :(得分:1)

我更喜欢图1,原因如下。

  1. 您可以将电子邮件字段设为UNIQUE,这样无论何种类型,您都只能存储一次。
  2. 如果您遇到必须在用户和电子邮件之间建立一对一关系的情况,那么将电子邮件和电子邮件类型紧密耦合似乎是不对的。
  3. 应该在业务逻辑中处理用户 - 电子邮件关系的任何类型的验证(即使您在数据库中有约束)。

答案 2 :(得分:1)

以下结构应符合条例草案:

enter image description here

用户和电子邮件之间存在1:N关系,每个用户的电子邮件可以包含零个或多个类型,来自共享类型

如果不需要在用户之间共享电子邮件类型,则可以进一步简化模型:

enter image description here

顺便说一下,由于地址固有的“模糊性”,地址使用M:N的情况也不清楚 - 请参阅this post了解有关该主题的一些问题。