【问题标题】:Store multiple email addresses in database for different user types为不同的用户类型在数据库中存储多个电子邮件地址
【发布时间】:2012-09-01 08:38:35
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: mysql sql database database-design


    【解决方案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 
    

    【讨论】:

    • 好的,我喜欢这个解决方案,我一直在考虑创建堆肥密钥选项,我在这篇文章中看到了 stackoverflow.com/a/5836504/1401319,这表明我可能会按照建议将 ID 保存在单独的列中,这是很好,除了我将如何为特定系统选择电子邮件,
    • 我是否只在帐户和客户列中使用占位符值,例如“SELECT * FROM email WHERE system = 1 AND account = 0 AND customer = 0”返回系统电子邮件详细信息...希望这有意义..?
    • 太多字符与我的帖子混淆,我正在寻找解决“SELECT * FROM email WHERE system = 1”将返回与 sys1 相关的所有电子邮件而不是电子邮件这一事实的解决方案对于 sys1。
    • 编辑了答案,看看最后的select语句
    • +1 这是处理这个问题的好方法。平衡规范化和可读性。在大多数情况下,有一个额外的多对多表会比必要的更复杂。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 2011-08-08
      • 2015-10-01
      • 2016-05-22
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多