Mysql 我是否应该规范我的数据库?

Mysql 我是否应该规范我的数据库?,mysql,database,optimization,rdbms,database-normalization,Mysql,Database,Optimization,Rdbms,Database Normalization,在为DB(例如MySQL)设计模式时,会出现是否完全规范化表的问题 一方面,连接(和外键约束等)非常慢,另一方面,您会得到冗余数据和潜在的不一致性 “最后优化”是正确的方法吗?i、 e.根据手册创建一个标准化DB,然后查看哪些可以非标准化以实现最佳速度增益 关于这种方法,我担心我会选择一种可能不够快的DB设计——但在那个阶段重构模式(同时支持现有数据)会非常痛苦。这就是为什么我想暂时忘记我所学到的关于“正确的”RDBMS实践的一切,试一下“平面表”方法 该数据库将被重插入是否会影响决策?数据库的

在为DB(例如MySQL)设计模式时,会出现是否完全规范化表的问题

一方面,连接(和外键约束等)非常慢,另一方面,您会得到冗余数据和潜在的不一致性

“最后优化”是正确的方法吗?i、 e.根据手册创建一个标准化DB,然后查看哪些可以非标准化以实现最佳速度增益

关于这种方法,我担心我会选择一种可能不够快的DB设计——但在那个阶段重构模式(同时支持现有数据)会非常痛苦。这就是为什么我想暂时忘记我所学到的关于“正确的”RDBMS实践的一切,试一下“平面表”方法


该数据库将被重插入是否会影响决策?

数据库的使用模式(重插入与重报告)肯定会影响您的规范化。此外,如果您看到规范化表的速度显著放缓,您可能需要查看索引等。您使用的是哪个版本的MySQL

一般来说,插入型数据库应该比报告型数据库更加规范化。然而,YMMV当然

“最后优化”是正确的方法吗?i、 e.根据手册创建一个标准化DB,然后查看哪些可以非标准化以实现最佳速度增益

我会说,是的。我已经和结构糟糕的DBs打过很多次交道,以至于没有经过深思熟虑就原谅了“平板”DBs


实际上,insert通常在完全规范化的DBs上表现良好,所以如果insert很重,这不应该是一个因素

哲学上的答案:次优(关系)数据库充斥着插入、更新和删除异常。这些都会导致数据不一致,导致数据质量差。如果你不能相信你的数据的准确性,那又有什么好处呢?问问自己:你是希望正确的答案慢一点,还是希望错误的答案快一点

作为一个实际问题:在你快速得到它之前先把它做好。我们人类很难预测瓶颈会发生在哪里。让数据库变得更好,在一段适当的时间内衡量性能,然后决定是否需要加快速度。在您取消规范化并牺牲准确性之前,请尝试其他技术:您能获得更快的服务器、连接、数据库驱动程序等吗?存储过程是否可以加快速度?指数及其填充系数是如何计算的?如果这些和其他性能和调整技术不起作用,那么只考虑非正规化。然后测量性能,以验证您是否获得了“付费”的速度提升。确保您正在执行优化,而不是悲观

[编辑]


问:如果我最后一次优化,你能吗 推荐一种合理的迁移方式 模式更改后的数据?如果,, 例如,我决定摆脱一个 查找表-如何迁移 现有数据库是否与此新设计相匹配

A:当然可以

  • 备份
  • 对其他设备进行另一次备份
  • 使用“从旧表中选择新表…”类型命令创建新表。您需要执行一些联接来组合以前不同的表
  • 扔掉旧桌子
  • 重命名新表
  • 但是。。。考虑一种更健壮的方法:

    现在就在完全规范化的表上创建一些视图。这些视图(数据上的虚拟表、“窗口”…如果您想了解有关此主题的更多信息,请询问我)将具有与上面步骤3相同的定义查询。在编写应用程序或DB层逻辑时,请使用视图(至少用于读取访问;可更新视图是……嗯,有趣的)。然后,如果以后进行反规范化,则如上所述创建一个新表,删除该视图,重命名新的基表,不管该视图是什么。您的应用程序/DB层不会知道其中的区别


    实际上,在实践中,这有更多的问题,但这应该让您开始。

    此问题的一般设计方法是首先将数据库完全正常化为第三个正常形式,然后根据性能和易用性进行非规范化。这种方法往往是最安全的,因为您是通过设计来做出特定决策的,而不是默认情况下的正常化

    “适当”是需要经验的棘手问题。规范化是一个相当“死记硬背”的过程,可以教授,知道去规范化的位置不太精确,取决于应用程序的使用情况和业务规则,因此会因应用程序而异。你所有的非规范化决策都应该为你的同行辩护

    例如,如果我有一对多的关系,那么在大多数情况下,我会将其正常化,但如果我知道该业务只有,比如说,每个a出现两次B,这是极不可能改变的,B记录中的数据有限。他们通常会用一个记录收回B数据,我很可能会用两个B字段来扩展A记录。当然,大多数通过DBA的人会立即将其标记为可能的设计问题,因此您必须能够令人信服地论证您的非规范化理由


    由此可以明显看出,非规范化应该是例外。在任何生产数据库中,我都希望绝大多数(95%以上)都是第三范式,只有少数非规范化结构。

    对于大量插入的数据库,我肯定会从规范化表开始。如果查询存在性能问题,我会首先尝试优化查询并添加有用的索引

    只有在这没有帮助的情况下,才应该尝试非规范化表。一定要在非规范化前后对插入和查询进行基准测试,因为这很可能