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

use*_*981 3 c# sql database asp.net oracle

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

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

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

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

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

补充:在过去,我曾与许多经验丰富的oracle数据库开发人员合作过,我们从未在表上使用过外键约束.

Dam*_*ver 14

我会说开发具有外键约束的应用程序,然后测量性能,如果性能是一个问题,测量数据库与FK约束之间的差异,如果它们被证明是性能问题,请考虑消除他们.

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

不需要它们,就像您不需要验证输入,佩戴安全带等一样.

  • +1加号:仅仅因为一点点性能,我绝不会**牺牲我的参照完整性 - **尤其是**不在生产中! (8认同)
  • @ user1263981 - 在每次插入子表之前对主表运行查询几乎肯定会比实现外键具有更差的性能,因为结果必须返回给应用程序 - 并且是安全的,事务必须为该电话和插入保持开放状态.显然,如果您不知道子行属于哪个主行,则必须查询主表以识别它,但是对于FK或没有FK是正确的. (3认同)