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

Posted

技术标签:

【中文标题】MYSQL - 为一个用户存储多个电子邮件/地址的最佳设计【英文标题】:MYSQL- Best design to store multiple emails/addresses for one user 【发布时间】:2013-06-11 10:15:57 【问题描述】:

我检查了这个问题here,但不幸的是,图表的链接不起作用,所以我被卡住了。

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

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

如果一个用户的工作和个人电子邮件相同,第一个图表对我有帮助(因为我不必存储两次)。第二个选项也不错,但即使一个用户将同一电子邮件用于工作、商务、个人等,我也必须存储两次或更多电子邮件。

我打算使用相同的想法来存储 地址,它比电子邮件占用更多空间,我认为 图 1 更适合于此。

你怎么看?

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

图 2

【问题讨论】:

您的两个图表都实现了多对多关系。您是否需要支持多个人共享一个电子邮件地址的可能性? @Dan Pichelman - 是的,这是可能的,但我不认为在电子邮件的情况下。由于我计划使用相同的模型来存储用户的地址,我确信会有用户共享相同的地址。或者,至少会有一些用户将地址用于个人和企业。 【参考方案1】:

我会使用

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

【讨论】:

好的。我明白你的意思了。那将消除一张桌子并保持简单。但是,如果我想对地址(包含更多信息)做同样的事情,如果我让用户共享一个地址,我将不得不多次存储相同的东西。同样的事情也适用于电子邮件。 这不允许同一个电子邮件有多种类型(例如,同时是“工作”和“个人”电子邮件)。【参考方案2】:

出于以下原因,我更喜欢图 1。

    您可以将电子邮件字段设为唯一,这样无论类型如何,您都只能存储一次。 如果您面临必须在用户和电子邮件之间建立一对一关系以实现其他功能的情况,那么将电子邮件和电子邮件类型紧密耦合似乎并不正确。 任何类型的用户-电子邮件关系验证都应在业务逻辑中处理(即使您在数据库中有约束)。

【讨论】:

【参考方案3】:

以下结构应该符合要求:

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

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

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

【讨论】:

感谢您的回答。对于第一个结构,在 email 表中,由于 email_id 是 PK,除非我也将 user_id PK,否则我将无法为不同的用户使用相同的电子邮件!我注意到您的结构与我的第一个结构非常相似。两者有区别吗? 忽略我的第一条评论。对于电子邮件,第一种结构有效,但对于地址则无效。然而,你的回答让我意识到我离我需要做的事情还很远。所以,我只会在同一个用户(工作/个人/账单等)之间共享一个地址,如果两个或多个用户共享同一个地址,我只需要创建另一个。这样,当有人需要更改他们存储的地址时会更容易。

以上是关于MYSQL - 为一个用户存储多个电子邮件/地址的最佳设计的主要内容,如果未能解决你的问题,请参考以下文章

在 mysql 中存储 JSON 数据

我可以在 .gitconfig 中为自己指定多个用户吗?

牛掰的[MySQL]数据库介绍

MySQL 数据库初识

如何使用存储在 Excel 中的地址向多个收件人发送电子邮件?

如何获取gmail用户的联系人?