【发布时间】:2019-10-21 00:23:35
【问题描述】:
假设我们要在关系数据库中存储以下数据:CountryName、CapitalCityName、CapitalCityPostCode。让我们假设一个城市只有一个邮政编码。我们可以用一种简单的方式在一个表中实现它:
Countries
[PK]CountryId, CountryName, CapitalCityName, CapitalCityPostCode
或者我们可以以更规范的方式将其排列成 1:1 关系的 2 个表:
Coutries
[PK]CountryId, CountryName, [FK]CapitalCityId
和
CapitalCities
[PK]CapitalCityId, CapitalCityName, CapitalCityPostCode, [FK]CountryId
这将如何影响性能?例如 - 如果我们需要列出所有国家的首都名称,在第一种情况下会明显更快吗?我需要多少记录/列才能看到差异?
【问题讨论】:
-
显然你可以看到第一个不是第三个范式。在性能方面,即使在处理 10 和数亿条记录时,正确规范化的表也将与第一个示例中的平面表相当。虽然平面文件总是会稍微快一点,但如果相关得当,数量会微不足道。第一个问题随着时间的推移变成可伸缩性。如果需要增长,您将放弃轻微的性能提升以换取不稳定的基础。
-
@xQbert 这确实回答了我的问题 - 您可以将其添加为答案而不是评论,以便其他人可以参考吗?
-
性能差异取决于您在实践中访问表的方式。显然,所需键的额外存储增加了无谓的重量,并且必须执行连接会带来性能损失(以及额外的查询复杂性)。唯一可能的好处是,如果 Capital city 的列很少被读取,而 Country 的列被经常读取,并且两个表都非常大,在这种情况下,拥有一个精简的 countries 表可能会具有一些性能优势。然而,这可能是一个极端情况,只有在它已经出现的情况下才能解决。
-
还可以考虑:stackoverflow.com/questions/1125004/… 作为以前的类似问题。
标签: sql database database-design relational-database