除了数据完整性之外,在数据库中建立适当的关系是否有助于其他任何事情?
它们是提高还是阻碍绩效?
只要您有与外键相对应的明显索引,就应该不会对性能产生明显的负面影响。这是您必须使用的更简单的数据库功能之一。
它既不会以任何显着方式帮助也不会损害性能。唯一的障碍是在插入/更新/删除时检查完整性。
外键是数据库设计的重要组成部分,因为它们确保了一致性。您应该使用它们,因为它对可能破坏您的应用程序的数据错误提供了最低级别的保护。另一个好处是数据库工具(可视化/分析/代码生成)使用外键来关联数据。
我不得不说,与忽略它们相比,适当的关系将有助于人们更好地理解数据(或数据的意图),尤其是在维护它们的总体成本相当低的情况下。
它们的存在不会影响性能,除非在架构方面(正如其他人指出的那样,数据完整性偶尔会导致外键违规,这可能会产生一些影响)但恕我直言,许多好处超过了(如果使用正确)。
我知道你没有问是否使用 FK,但我想我只是添加一些关于为什么使用它们的观点(并且必须处理后果):
还有其他考虑因素,例如如果您打算使用 ORM(可能稍后),您将需要外键。它们对于 ETL/数据导入和导出以及以后的报告和数据仓库也非常有帮助。
如果其他应用程序将使用该模式,这也很有帮助——因为外键实现了基本的业务逻辑。因此,您的应用程序(和任何其他应用程序)只需要了解这些关系(并尊重它们)。它将保持数据的一致性,并且最有可能减少任何消费应用程序中的数据错误数量。
最后,它为您提供了关于在何处放置索引的相当不错的提示——因为您很可能会通过 FK 值查找表数据。
数据库中的关系是提高还是阻碍性能?
与工具箱中的任何工具一样,您将获得的结果取决于您如何使用它。正确指定的关系和设计良好的逻辑数据库可以极大地提高性能——例如,考虑搜索规范化数据和非规范化数据之间的差异。
根据您的数据库引擎,通过外键约束定义的关系可以提高性能。该约束允许引擎对键的父侧表中数据的存在做出某些假设。
可以在http://www.microsoft.com/technet/abouttn/flash/tips/tips_122104.mspx找到 MS SQL Server 的简要说明。我不知道其他引擎,但这个概念在其他平台上是有意义的。
无论您声明与否,数据中的关系都存在。通过 FK 约束声明和强制执行关系将防止数据中的某些类型的错误,在发生插入/更新/删除时检查数据的成本很小。
通过关系声明级联删除有助于防止在删除数据时出现某些类型的错误。
了解关系有助于在形成查询时灵活和正确地使用数据。
设计好表格可以使关系更明显和更有用。在数据中使用关系是首先使用关系数据库的主要动力。
关于对性能的影响:根据我使用 MS Access 2003 的经验,如果您有一个多用户应用程序并使用关系来强制执行大量引用完整性,那么您可能会在最终用户的响应时间方面受到很大影响。
有不同的方法来执行参照完整性。我决定在关系中去掉一些规则,在前端建立更多的执行力,并忍受一些 RI 的损失。当然,在多用户环境中,你要非常小心那一点自由。
根据我构建性能敏感型数据库的经验,外键对性能的影响非常大,因为每次插入/更新引用记录或删除主记录时都必须检查它们。如果您需要证明,只需查看执行计划即可。
我仍然保留它们作为文档和工具使用,但我通常禁用它们,特别是在只能通过应用程序层访问 DB 的高性能系统中。