M.F*_*985 3 database performance normalization
我正在阅读这个问题https://meta.stackexchange.com/questions/26398/stackoverflow-database-design-join-issues,我得到了以下问题:使用非常规范化的数据库效率不高?
应该如何找到正确的妥协方案?
我不确定这个问题是否更适合这里或程序员。这里有一些类似的,但如果我应该搬家,请问我。
是否会加速或减慢速度很大程度上取决于数据的性质、表的大小、查询的类型和索引。我已经看到它是双向的,尽管根据我的经验,标准化到第三范式通常会加快速度。关系数据库的构建是为了规范化和设计,以便这些事情是预期的。
非规范化倡导者经常忘记的一件事是速度对于事务至关重要(由于潜在的阻塞可能更重要)并且非规范化通常会减慢更新速度。您不能仅根据 select 语句来衡量性能。非规范化的数据库表通常更宽,而更宽的表通常也会导致速度变慢。
非规范化数据库是保持数据完整性的一个主要问题,规范化数据库中公司名称的更改可能会导致需要更新一条记录,而非规范化数据库中可能会导致需要更新 100,000,000 条记录。这就是为什么非规范化通常只适用于通过 ETL 过程加载数据的数据库(例如数据仓库),但数据库本身经常被查询以获取复杂的报告场景。具有大量用户更新和删除和插入的事务数据库如果至少规范化为第三范式,通常会快得多。现在你也可以对标准化感到疯狂,别误会我的意思。我不应该为了得到一个简单的地址而加入 10 张桌子,尤其是如果我经常得到它们的话。经常一起使用的数据通常属于在一起,特别是如果进行更改后这些项目不太可能更改一百万条记录。例如,在地址中,如果芝加哥将其名称更改为新芝加哥,则需要进行大规模更新,但这种大规模地址更改在我所在的地区非常罕见。另一方面,公司名称更改很频繁,如果需要对数百万条非规范化记录进行更改,可能会造成巨大的破坏。
如果您不设计数据仓库,请规范化您的数据。除非您是在大型系统中拥有至少 5 年经验的数据库专家,否则切勿进行反规范化。如果你不知道自己在做什么,你可能会造成巨大的伤害。如果事情进展缓慢,非规范化是最后尝试的性能改进之一。通常,通过编写更好的可控制查询并且不使用性能较差的技术(例如相关子查询)或应用正确的索引来解决该问题。