我为什么要创建外键约束?

时间:2012-07-02 12:18:01

标签: c# asp.net sql database oracle

我正在为Timesheet应用程序设计一个oracle数据库。我想知道是否真的有必要对表(Master和Child)进行外键约束。

我们知道理论上在表格上有一个适当的参照完整性是好的,但我们真的需要它们吗?

我听说外键使得数据库在每个DML操作上都是额外的,因为它必须检查FK的一致性。这会降低性能。但另一方面,在子表中插入新行之前删除主键的情况会很有帮助。

性能是时间表应用程序中的主要问题,并且将在月底(可能在同一时间)填写他们的时间表中约250人。

如果我没有表上的外键约束,那么在每次在子表中插入新记录之前,主表中是否存在主键时,是否必须首先检查它(在存储过程中)? / p>

已添加:过去,我曾与许多经验丰富的Oracle数据库开发人员合作过,我们从未在表上使用外键约束。

5 个答案:

答案 0 :(得分:14)

我会说使用外键约束来开发应用程序,然后测量性能,如果性能有问题, measure 数据库与FK约束和没有的差异,如果它们被证明是性能问题,考虑消除它们。

您不太可能发现它们是任何性能问题的根源,我不建议从一开始就完全忽略它们,因为它会导致更好的性能。

你不需要它们,就像你不需要验证输入,穿安全带等一样。

答案 1 :(得分:4)

使用引用完整性,插入或更新键列时会有轻微的性能损失。然而,这几乎总是由

补偿

1)可靠且一致的数据

2)Significantly improved query times

但是,如果你没有强制执行参照完整性,那么为什么你会使用参考数据库呢?

答案 2 :(得分:3)

确保强制执行外键的任何方法(例如在sp或触发器中)将至少与引用约束一样慢(期望它慢得多)。更快的唯一可能性是确保您的应用程序没有任何错误,并且它不会创建丢失的引用。由于某些原因,这太难了:

考虑以下场景:表A有一个引用表B的列,一个用户在B中插入一行,在任何人在A中使用它之前,决定删除它...同时,另一个用户已经打开了A的插入形式有一个充满B行的组合框。当他保存这个A时,它可以引用错误的B,我看不到任何自然的架构来防止这种情况,这可能会比关系本身更快。

我可以继续使用尽可能多的示例,但简而言之,我在应用程序架构方面的经验表明尽可能多地保留模式级别的约束,并有更多时间与家人共度!

答案 3 :(得分:3)

除了其他人对数据一致性和查询性能所说的内容......

将外键放在数据库中也是文档 - 您不需要翻阅代码库来理解表的关联方式。随着数据库中表的数量增加或者访问该数据的应用程序数量增加(或者您无法访问代码而仍需要了解数据),这一点变得更加重要。

答案 4 :(得分:1)

我的2美分...... 250人无需担心。数据库可以处理大量数据和引用。这是他们的目的。在创建键和结构时,显然要用头脑。但是你可以获得准确的数据和钥匙,而不是可能的噩梦来建立报告和什么不是......而且在一天结束时......这就像你描述的应用程序一样,简化和协助数据输入并实施数据准确性。