一个哲学答案:次优(关系)数据库充斥着插入、更新和删除异常。这些都导致数据不一致,导致数据质量不佳。如果你不能相信你的数据的准确性,那有什么好处呢?问问自己这个问题:你想要更慢地得到正确答案还是想要更快地得到错误答案?
作为一个实际问题:在快速获得它之前先把它做好。我们人类非常不擅长预测瓶颈会发生在哪里。让数据库变得更好,在相当长的一段时间内衡量性能,然后决定是否需要让它更快。在你去规范化和牺牲准确性之前尝试其他技术:你能获得更快的服务器、连接、数据库驱动程序等吗?存储过程会加快速度吗?索引及其填充因子如何?如果这些以及其他性能和调优技术不能解决问题,那么只有考虑非规范化。然后测量性能以验证您是否获得了“付费”的速度提升。确保您正在执行优化,而不是悲观化。
[编辑]
Q:那么如果我最后优化的话,能否推荐一种合理的方式来在架构改变后迁移数据?例如,如果我决定摆脱查找表 - 我如何将现有的数据库迁移到这个新设计?
答:当然。
- 做好备份。
- 再次备份到不同的设备。
- 使用“从旧表中选择新表...”类型命令创建新表。您需要进行一些连接来组合以前不同的表。
- 删除旧表。
- 重命名新表。
但是......考虑一个更强大的方法:
立即在完全规范化的表上创建一些视图。这些视图(虚拟表、数据上的“窗口”......问我是否想了解更多关于该主题的信息)将具有与上述第三步相同的定义查询。当您编写应用程序或 DB 层逻辑时,请使用视图(至少用于读取访问;可更新的视图......嗯,很有趣)。然后,如果您稍后进行非规范化,则如上所述创建一个新表,删除视图,重命名新的基表,无论视图是什么。您的应用程序/数据库层不会知道其中的区别。
在实践中实际上还有更多内容,但这应该可以帮助您入门。