表中的数据不一致

时间:2015-04-16 21:55:09

标签: database

我工作的合作伙伴使用以下字段创建了客户表:

first_name,middle_name,last_name,second_last_name,full_name

其中full_name是其他字段的串联。

你能给我最好的解释,为什么这是一个不好的做法?

2 个答案:

答案 0 :(得分:2)

它并不理想,因为迟早会有人或某事在不更新last_name的情况下更新first_namefull_name,反之亦然,而且您和#39;在你的数据库中会有这样的东西:

first_name   last_name   full_name
John         White       John Black

然后你会试着找出差异的来源以及这个家伙的名字应该是什么,这没什么好玩的。如果您要去denormalize这样的表格,那么应该有一些令人信服的理由。您希望full_name成为一个独立领域的合作伙伴的理由是什么?

您应该研究替代方案。例如,您可以定义一个view,它返回表中的各种名称组件,并将它们组装成full_name。根据您的RDBMS,您可能还有其他选项。例如,在SQL Server中,您可以将computed column权限放入表中。

declare @customer table (first_name varchar(50), last_name varchar(50), full_name as first_name + ' ' + last_name);
insert @customer values ('John', 'B');
select * from @customer;

结果:

first_name   last_name   full_name
John         B           John B

答案 1 :(得分:0)

如果full_name在存储中持久存在,那么您的数据就会翻倍:您浪费了两倍的存储空间,没有任何好处,也无法进行编辑或其他维护。

如果full_name列实际上是一个函数(例如,它是根据此行中的其他元素计算的),那么解决方案就可以了!

根据您使用的数据库引擎,只能读取这些计算列(您必须更新其他列以更改其结果),甚至可以读写。写入这样的列由另一个函数处理,例如,该函数可以解析全名并将部分存储在要更新的行中。