2012-07-02 39 views
3

我正在为Timesheet应用程序设计一个Oracle数据库。我想知道是否真的有必要对表(主和子)有外键约束。为什么我应该创建外键约束?

正如我们所知道的那样,从理论上讲,在表格上有适当的参照完整性是很好的,但是我们真的需要它们吗?

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

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

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

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

+9

250的用户还不是很多。特别是如果它每周只有一次 - 你不应该关心从foriegn关键约束检查中感知到的性能。 – slugster

+1

http://stackoverflow.com/questions/2317391/is-there-a-severe-performance-hit-for-using-foreign-keys-in-sql-server – Habib

+3

一切,你不要在你的数据库检查会最终包含无效数据。所以除非你想在几年内有大量的数据垃圾,否则实施你的限制。 – Rene

回答

14

我会说,在地方外键约束,然后措施的性能和开发应用如果性能是一个问题,措施与FK约束和无DB之间的差异,以及如果他们证明是一个性能问题,考虑消除它们。

您不太可能会发现它们是任何性能问题的来源,我不会推荐从一开始就完全忽略它们,以此推测它会带来更好的性能。

你不需要他们,因为你不需要验证输入,系好安全带以同样的方式,等

+7

+1加上:只是因为一点点的表现,我会**永远不会**牺牲我的参考完整性 - **特别是**不在生产中! –

+0

如果我没有上表的外键约束,则我一定要首先检查它(在存储过程中)如果主键在主表中存在每次在子表中插入新记录之前?难道它不会减慢DML操作,因为每当我插入一条新记录时,我都会向高手(对于PK存在)查询表? – user1263981

+0

通过运行您所说的查询(每次插入或更新和删除前),您正在对该密钥字段进行某种形式的验证,从而强制实现密钥的参照完整性。至于表现,我认为你最好的选择是......进行测试,看看有什么? :/ –

1

我2美分... 250人是什么担心。数据库可以处理大量的数据和引用。这是他们的目的。在创建按键和结构时显然会用到你的头。但是,您将掌握准确的数据,而不是可能出现的噩梦来建立报告,甚至不可能......在一天结束时......这就是您描述的应用程序的一个重点,缓解和协助数据输入并加强数据准确性。

4

具有参照完整性时,插入或更新关键列时会有轻微的性能下降。然而,这几乎比总是更弥补了

1)可靠和一致的数据

2)Significantly improved query times

真的,不过,如果你不实施参照完整性,为什么地球上你会使用参考数据库?

3

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

请考虑以下情形:表A有一个引用表B的列,一位用户在B中插入一行,并且任何人在A中使用它之前决定删除它。同时,另一个用户已经打开了A的插入表单,该表单中有一个组合框填充了B行。当他保存这个A时,它可以引用一个错误的B,并且我没有看到自然的体系结构来阻止这个,可以可能更快的关系本身。

我可以如你所愿尽可能多的例子下去,但总之,我的应用程序体系结构的经验说,保持尽可能多的架构级约束地,并有更多的时间与家人在一起!

3

除了其他人所说关于数据的一致性和查询性能...

具有外键在数据库中也documentation--你不需要通过你的代码库翻找了解如何表格应该涉及。随着数据库中表的数量增加或者触及该数据的应用程序数量增加(或者您无法访问代码并且仍然需要理解数据),这变得更加重要。