在 MySQL 中实现 3NF 而不损失查询速度?
Posted
技术标签:
【中文标题】在 MySQL 中实现 3NF 而不损失查询速度?【英文标题】:achieving 3NF in MySQL without losing query speed? 【发布时间】:2021-12-19 19:55:01 【问题描述】:我第一次练习使用 SQL 制作数据库,并且在我真正开始编写任何查询之前先制作 ER 图。我想尝试实现 3NF,但不确定基于我尝试的示例场景是否完全成功。 3nf 是否总是用于查询速度的最佳规范化?
【问题讨论】:
【参考方案1】:规范化与查询速度无关。如果使用完全规范化,即使查询需要进行连接,也可以进行高性能查询。我经常看到在高性能生产系统中的关系表之间使用连接。
规范化是关于消除数据异常,也就是说,让您的数据模型防止数据与自身不一致的奇怪情况。
通常,您应该使用精心选择的索引来优化查询,以支持您需要以高性能运行的特定查询。在不知道需要哪些查询才能获得最佳性能的情况下,您无法选择索引。
这足以在 90% 的情况下为您的数据库提供充足的性能。如果这还不够,您可能需要使用非规范化或缓存或分片或其他技术来缓解性能瓶颈。
但是恕我直言,您应该从已规范化的数据库开始。这将使其对数据异常的抵抗力最强,并且还将使其支持最广泛的查询类型。
仅当您遇到性能问题时才使用优化,因为大多数类型的优化会使您的代码更加复杂。
【讨论】:
感谢您的详细回复,现在更有意义了。您能否告诉我我的 er 图表是否适合我的场景并且它是否完全符合 3NF?谢谢。 您可能应该自己阅读规范化并理解它的含义。它应该包含在任何关于关系数据库设计的好书中。或者您可以阅读***摘要:en.wikipedia.org/wiki/Database_normalization以上是关于在 MySQL 中实现 3NF 而不损失查询速度?的主要内容,如果未能解决你的问题,请参考以下文章