【问题标题】:Two database tables storing email addresses, one of the addresses to be set to default存储电子邮件地址的两个数据库表,其中一个地址设置为默认值
【发布时间】:2013-12-04 16:39:11
【问题描述】:
我有一个 SQL Server 数据库,其中包含两个表,这两个表都包含电子邮件地址。一个包含组织为用户创建的电子邮件地址,另一个包含用户的个人电子邮件地址。
我们希望为用户提供将其中之一设置为首选联系电子邮件地址的选项。在数据库中表示它的最佳方式是什么?
据我所知,我可以:-
- 在每个名为 is_preferred 的表上创建相同的字段。创建一个存储过程来设置电子邮件地址所属的相应表中的正确字段,确保没有将任何其他电子邮件地址设置为默认值
- 创建一个存储首选邮件地址 ID 的新表。我还需要在此表中有一个“邮件类型”,以了解我需要在哪个表中查找邮件地址。即个人或组织电子邮件。
您认为哪种解决方案最好?
一个用户可以有多个组织邮件地址以及多个个人电子邮件地址。
【问题讨论】:
标签:
sql
sql-server
database
database-design
【解决方案1】:
这是一种模式化的方法:
注意:如果没有 (特定字段) 或 (特定约束),只需将所有三个电子邮件表合并为一个。
EMAIL 的复合 PK 在给定人员级别建立了电子邮件的排序。然后,您可以简单地引入一个约定,即相对于该排序的第一行是“首选”电子邮件。
这是另一种方式(如果您想要更简单的键):
【解决方案2】:
我将创建一个电子邮件地址表,其中包含 email_id、email_address、employee_id 和 type 列(个人或组织标志)。然后我会将preferred 列添加到我的员工表中,并让它存储适当的email_id。
我认为电子邮件地址必须是 DISTINCT,因此您可能可以将 id 全部废弃,而将地址作为键。
【解决方案3】:
我希望有一个单独的表与
UserId, PreferredOrgEmailId, PreferredPersonalEmailId
这整个情况远非理想,但如果你不得不使用它......单独的表格会起作用。因此,您可以使用 FK 来确保您的数据不会不同步。此外,也许是一个检查约束,以确保您只能填充一个电子邮件 ID(组织或个人)。
实际上在这个新表中存储电子邮件地址是 2NF。