首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表中数据不一致

表中数据不一致
EN

Stack Overflow用户
提问于 2015-04-17 05:55:09
回答 2查看 33关注 0票数 1

我工作的一个合作伙伴创建了包含以下字段的customer表:

first_name、middle_name、last_name、second_last_name、full_name

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

你能给我最好的解释为什么是一个糟糕的实践吗?

EN

回答 2

Stack Overflow用户

发布于 2015-04-17 06:13:56

这并不理想,因为迟早会有人或某事在不更新full_name的情况下更新last_namefirst_name,反之亦然,您的数据库中会有如下内容:

代码语言:javascript
复制
first_name   last_name   full_name
John         White       John Black

然后,你可以试着找出差异是从哪里来的,以及这个人的姓氏应该是什么,这并不有趣。如果您要denormalize这样的表,应该有一些令人信服的理由这样做。你的合作伙伴希望full_name成为一个独立字段的理由是什么?

您可能应该研究一下替代方案。例如,您可以定义一个view来返回表中的各种name组件,并将它们组装到一个full_name中。根据您的RDBMS,您还可能有其他选择。例如,在SQL Server中,您可以将computed column直接放入表中。

代码语言:javascript
复制
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;

结果:

代码语言:javascript
复制
first_name   last_name   full_name
John         B           John B
票数 2
EN

Stack Overflow用户

发布于 2015-04-17 06:17:04

如果将full_name持久化到存储上,那么数据就会加倍:您浪费了两倍的存储空间,却没有带来任何好处,而且在编辑或其他维护方面也会产生额外的开销。

如果full_name列实际上是一个函数(例如,它是从此行上的其他元素计算得出的),那么解决方案就很好!

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29686670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档