我工作的一个合作伙伴创建了包含以下字段的customer表:
first_name、middle_name、last_name、second_last_name、full_name
其中full_name是其他字段的串联。
你能给我最好的解释为什么是一个糟糕的实践吗?
发布于 2015-04-17 06:13:56
这并不理想,因为迟早会有人或某事在不更新full_name的情况下更新last_name或first_name,反之亦然,您的数据库中会有如下内容:
first_name last_name full_name
John White John Black然后,你可以试着找出差异是从哪里来的,以及这个人的姓氏应该是什么,这并不有趣。如果您要denormalize这样的表,应该有一些令人信服的理由这样做。你的合作伙伴希望full_name成为一个独立字段的理由是什么?
您可能应该研究一下替代方案。例如,您可以定义一个view来返回表中的各种name组件,并将它们组装到一个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发布于 2015-04-17 06:17:04
如果将full_name持久化到存储上,那么数据就会加倍:您浪费了两倍的存储空间,却没有带来任何好处,而且在编辑或其他维护方面也会产生额外的开销。
如果full_name列实际上是一个函数(例如,它是从此行上的其他元素计算得出的),那么解决方案就很好!
根据您使用的数据库引擎,这些计算列只能是读取的(您必须更新其他列以更改其结果),甚至是读写的。写入这样的列是由另一个函数处理的,例如,该函数可以解析全名并将部分存储在要更新的行中。
https://stackoverflow.com/questions/29686670
复制相似问题