客户必须至少有3封电子邮件

时间:2014-08-29 20:06:25

标签: mysql database-design constraints data-modeling data-integrity

我想创建一个数据库模型,其中每个客户必须至少有3个电子邮件。

第一个想法是将其建模如下(我将使用MySQL语法):

create table customer (
  id int not null auto_increment primary key,
  ...
  text e-mail1 not null,
  text e-mail2 not null,
  text e-mail3 not null);

create table customer_emails(
    id int not null auto_increment primary key, 
    text e-mail
    ...
    foreign key (customer_id) references customer(id));

您可以注意到,在此模型中,存在数据冗余的可能性。

让我们假设一个例子,我们想要将一个有5封电子邮件(e1,e2,e3,e4,e5)的客户插入数据库。 三个电子邮件(e1,e2,e3)肯定会插入表customer。 现在,我们有两种可能性。

  1. 将e4,e5插入customer_emails
  2. 将e1,e2,e3,e4,e5插入customer_emails
  3. 什么是更好的方法,为什么? 1(无冗余)或2(冗余)?

1 个答案:

答案 0 :(得分:1)

第二种选择更好。但是,在您的情况下,所有customer封电子邮件都应存储在customer_emails中,无论他们是否有3或25封。

如果您有多个客户可以拥有的电子邮件,则不应将其中的任何电子邮件存储在customer表中。而是将所有这些存储在customer_emails表中。摆脱e-mail1e-mail2e-mail3。要从customer表中获取三封电子邮件而从另一张表中获取其余内容将会令人困惑。

图示如何在方案1中获取特定客户的所有电子邮件:

SELECT c.id, c.email1, c.email2, c.email3, ce.email
FROM customer c
INNER JOIN customer_emails ce on ce.customer_id = c.id
WHERE id = 67

以上将返回:

c.id  c.email1     c.email2     c.email3    ce.email  
67    ed@mm1.com   ed@mm2.com   ed@mm3.com  ed@mm4.com
67    ed@mm1.com   ed@mm2.com   ed@mm3.com  ed@mm5.com
67    ed@mm1.com   ed@mm2.com   ed@mm3.com  ed@mm6.com
67    ed@mm1.com   ed@mm2.com   ed@mm3.com  ed@mm7.com
67    ed@mm1.com   ed@mm2.com   ed@mm3.com  ed@mm8.com
67    ed@mm1.com   ed@mm2.com   ed@mm3.com  ed@mm9.com

现在考虑一下,方案2:

SELECT c.id, ce.email
FROM customer c
INNER JOIN customer_emails ce on ce.customer_id = c.id
WHERE id = 67

将返回:

c.id  ce.email
67    ed@mm1.com
67    ed@mm2.com
67    ed@mm3.com
67    ed@mm4.com
67    ed@mm5.com
67    ed@mm6.com
67    ed@mm7.com
67    ed@mm8.com
67    ed@mm9.com

由于所有电子邮件地址都在一个字段中,因此第二个选项更容易/更清晰。