mysql - 在 MySQL 中实现 3NF 而不损失查询速度?
问题描述
我第一次练习使用 SQL 制作数据库,并且在我真正开始编写任何查询之前先制作 ER 图。我想尝试实现 3NF,但不确定基于我尝试的示例场景是否完全成功。3nf 是否总是用于查询速度的最佳规范化?
解决方案
规范化与查询速度无关。如果使用完全规范化,即使查询需要进行连接,也可以进行高性能查询。我经常看到在非常高性能的生产系统中的关系表之间使用连接。
规范化是关于消除数据异常,也就是说,使您的数据模型可以防止数据与自身不一致的奇怪情况。
通常,您应该使用精心选择的索引来优化查询,以支持您需要以高性能运行的特定查询。在不知道需要哪些查询才能获得最佳性能的情况下,您无法选择索引。
这足以在 90% 的情况下为您的数据库提供充足的性能。如果这还不够,您可能需要使用非规范化或缓存或分片或其他技术来缓解性能瓶颈。
但是恕我直言,您应该从已规范化的数据库开始。这将使其对数据异常的抵抗力最强,并且还将使其支持最广泛的查询类型。
仅当您遇到性能问题时才使用优化,因为大多数类型的优化会使您的代码更加复杂。
推荐阅读
- javascript - 将图像内的坐标转换为图形
- python - 从视频流中执行接近实时的人员检测的问题
- javascript - Mobx 可观察映射到 js 数组
- ssis - SSIS foeach 容器正在跳过子文件夹
- hyperledger-fabric - 是否可以在 Hyperledger 中定义对查询的访问控制?
- apache - htaccess阿帕奇。如何允许通过 ip 访问管理员的 url?
- r - `_bookdown.yml`、`_output.yml` 和第一个文档的 yaml 标头有什么区别?
- excel - 基于多列删除表中的重复项
- python - Python在多列中返回第一个非零值
- java - 将一个对象复制到另一个对象中,更改某些字段的数据类型