1

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

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

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

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

谢谢

4

2 回答 2

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 
于 2012-09-01T08:49:23.280 回答
0

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

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

于 2012-09-01T08:49:40.490 回答