我想创建一个数据库模型,其中每个客户必须至少有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
。
现在,我们有两种可能性。
customer_emails
customer_emails
什么是更好的方法,为什么? 1(无冗余)或2(冗余)?
答案 0 :(得分:1)
第二种选择更好。但是,在您的情况下,所有customer
封电子邮件都应存储在customer_emails
中,无论他们是否有3或25封。
如果您有多个客户可以拥有的电子邮件,则不应将其中的任何电子邮件存储在customer
表中。而是将所有这些存储在customer_emails
表中。摆脱e-mail1
,e-mail2
,e-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
由于所有电子邮件地址都在一个字段中,因此第二个选项更容易/更清晰。