Almacenar múltiples direcciones de correo electrónico en la database para diferentes types de usuarios

La pregunta rápida sobre la forma más eficiente fue manejar esto, tengo una database que tiene una estructura en tree de types de usuario,

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

Los tres types pueden tener múltiples direcciones de correo electrónico, me preguntaba cuál sería la mejor manera de manejar esto en una database, todos los types de usuarios tienen auto_id como key principal, por lo que no funcionaría una tabla con la dirección identificada por su key principal relacionada. será potencialmente 3 de cada uno. por ejemplo, el correo electrónico con la key 2, se vinculará al sistema con id 2, count con id 2, etc.

¿Debo crear una tabla de direcciones de correo electrónico para cada tipo? ¿O hay una solución más elegante?

Gracias

O bien tiene una tabla de correo electrónico que tiene una key externa que es un system_id, account_id o customer_id. Luego puede tener un campo que especifique el tipo de esa key externa. Otra estrategia más complicada sería tener aún la tabla de correo electrónico, pero no la key externa. Otra tabla a la que llamaría email_relation que consiste en el email_id y la key externa. De esta forma, podría usar una dirección de correo electrónico para las tres tablas.

Ejemplo del uso de dos tablas

 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 

si desea la tabla de clientes incluyendo la dirección de correo electrónico

 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 

Si quieres todo el correo electrónico a un sistema, también puedes

 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 

Puede build una key compuesta para identificar un logging en cualquier nivel de la jerarquía y luego usarlo como FK en su tabla de correo electrónico. Entonces, un logging de correo electrónico podría apuntar a sys1.acc7 , otros podrían apuntar a sys3.acc4.cus99 . La key compuesta está formada por auto_ids conectados de cualquier forma que tenga sentido para su sistema.

Puede determinar esta key compuesta para cualquier punto de la jerarquía y, a partir de allí, encontrar todas las direcciones de correo electrónico correspondientes para ese punto.