在数据库中存储多个电子邮件地址以用于不

时间:2012-09-01 08:38:35

标签: mysql sql database database-design

关于效率最高的快速问题是处理这个问题,我有一个数据库,它有一个用户类型的树结构,

system ---  1 to m --- account --- 1 to m --- customer  

这三种类型都可以有多个电子邮件地址,我想知道在数据库中处理这个问题的最佳方法是什么,所有用户类型都将auto_id作为主键,因此有一个表由地址标识相关的主键不会工作,因为每个可能有3个。例如带密钥2的电子邮件将链接到ID为2的系统,ID为2的帐户等。

我应该为每种类型创建一个电子邮件地址表吗?或者是否有更优雅的解决方案。

由于

2 个答案:

答案 0 :(得分:1)

您有一个电子邮件表,其外键是system_id,account_id或customer_id。然后,您可以指定一个指定该外键类型的字段。另一个更复杂的策略是仍然使用电子邮件表但没有外键。您将调用email_relation的另一个表,其中包含email_id和外键。这样你就可以为所有三个表使用一个电子邮件地址。

使用两个表的示例

system
--------
s1 
s2
s3

account
--------
a1
a2
a3

customer
--------
c1
c2
c3

email
------
e1 example1@a.com
e2 example2@a.com
e3 example3@a.com
e4 example4@a.com

email_relation
---------------
email_id     foreign_id      relation_type
e1           s1              system
e1           a1              account
e1           c1              customer
e2           c1              customer
e3           c2              customer
e4           a3              account
e4           c3              customer

如果您想要包含电子邮件地址的客户表

select c.customer_id, e.email
from customer c
left join email_relation r on (r.foreign_id = c.customer_id and relation_type = 'customer')
left join email          e on (e.email_id    = r.email_id)
where r.email_id is not null

如果您想要系统的所有电子邮件,您也可以

select e.email
  from email e
  join email_relation r on (r.email_id = e.email_id and relation_type = "system")
 where r.foreign_id = 1 

答案 1 :(得分:0)

您可以构建复合键以标识层次结构中任何级别的记录,然后将其用作电子邮件表中的FK。因此,一封电子邮件记录可能指向sys1.acc7,其他一些可能指向sys3.acc4.cus99。复合键由以任何对您的系统有意义的方式串联在一起的auto_ids组成。

您可以为层次结构中的任何点确定此复合键,然后从中找到该点的所有相应电子邮件地址。