在 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 而不损失查询速度?的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中实现一个复杂的查询

在 keras 中实现三元组损失的准确性

在 Keras 中实现批次相关的损失

如何在 keras 中实现 ssim 的损失函数?

如何在 keras 模型中实现汉明损失作为自定义指标

如何在pytorch中实现可微的汉明损失?