0

如果我不需要在逻辑上是 a 的字段中使用cascade/和类似的约束,除了美学之外,我是否有任何理由将其明确声明为 a ?restrictforeign keyforeign key

它实际上不会降低性能,因为它必须测试完整性吗?

编辑:澄清一下,我不需要它,因为:

  • 无论如何我都不会编辑或删除这些值,所以我不需要做cascade类似的检查
  • 在调用之前INSERT,我会检查目标键是否存在,所以我也不需要restrict检查

我知道,如果数据库以某种方式损坏,这种约束将确保该关系仍然有效,这是一件好事。但是,我想知道在我的情况下是否还有其他理由使用此功能。我错过了什么吗?

4

2 回答 2

3

这个问题的答案实际上可能也适用于您的问题。

如果表中的列引用其他表中的行,则应始终使用外键,因为即使您认为“不需要”这些检查提供的功能,它仍然有助于保证数据完整性,以防万一忘记检查您自己的代码。

在大多数情况下,外键检查的性能影响可以忽略不计(参见上面的链接),因为关系数据库使用非常优化的算法来执行它们(毕竟,它们是一个关键特性,因为它们实际上定义了实体之间的关系)。

FK 的另一个主要优点是它们还将帮助其他人了解您的数据库的布局。

编辑: 由于上面链接的问题是指 SQL-Server,这里有一个与 MySQL 非常相似的回复:Does Introduction Foreign Keys to MySQL reduce performance

于 2013-03-25T14:19:12.200 回答
2

你必须这样做。如果它会触及写入性能 - 这是一个“像素”问题。

主要的性能问题在读取中——FK 可以帮助查询优化器选择最佳计划等。即使你的 DBMS(-s)(如果你提供跨 DBMS 解决方案)现在会从中受益——它可能会在以后发生。

所以答案是——是的,不仅仅是美学。

于 2013-03-25T14:27:23.127 回答