我工作的合作伙伴使用以下字段创建了客户表:
first_name,middle_name,last_name,second_last_name,full_name
其中full_name是其他字段的串联。
你能给我最好的解释,为什么这是一个不好的做法?
答案 0 :(得分:2)
它并不理想,因为迟早会有人或某事在不更新last_name
的情况下更新first_name
或full_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列实际上是一个函数(例如,它是根据此行中的其他元素计算的),那么解决方案就可以了!
根据您使用的数据库引擎,只能读取这些计算列(您必须更新其他列以更改其结果),甚至可以读写。写入这样的列由另一个函数处理,例如,该函数可以解析全名并将部分存储在要更新的行中。