我意识到这个问题可能看起来有点“绿色”,但在我遇到过大量“企业”或“商业”数据库之后,我开始问这个问题。约束为数据库提供了哪些优势?我更多地询问外键约束而不是唯一约束。它们提供性能提升还是仅提供数据完整性?

我对没有外键甚至没有指定主键(只是字段不为空的约束或字段的唯一约束)的关系数据库的数量感到相当惊讶。

想法?

有帮助吗?

解决方案

“仅仅” 数据的完整性?你说,就像是一个次要的事情。在所有的应用程序,这是至关重要的。所以,是的,它提供的,这是一个巨大的好处。

其他提示

数据完整性是他们提供什么。如果任何他们有性能成本(至少一个很小的一个)。

它们提供了性能和数据完整性,而后者是极为重要的任何严重系统。我畏缩每次我看到一个数据库,没有任何外键和所有的完整性通过触发器进行(如果有的话)的时间。我又看见了不少的在那里。

以下内容,假设您首先得到了正确的约束:-

  • 您的数据在约束条件下有效
  • 数据库知道您的数据相对于约束是有效的,并且可以在查询或更新数据库时使用它(例如删除视图查询中不必要的连接)
  • 为数据库的未来用户记录该约束
  • 违反约束的行为将尽快被抓获;不在后来失败的一些不相关的过程中

在关系理论中,允许数据不一致的数据库并不是真正的关系数据库。外键对于数据完整性和一致性是必要的,以保持数据库的“关系”;IE。数据库的逻辑模型始终是正确的。

实际上,定义外键并让数据库引擎处理以确保关系有效通常更容易。其他选项是:

  • Nothing - 保证数据损坏 在某个时候
  • 数据库触发器 - 其中 通常会更慢、更少 高性能
  • 应用程序代码 - 其中 最终会在以下情况下引起问题 要么你忘了打电话 代码或其他应用程序访问 数据库。

数据是一种资产。教科书大量指出。

但它其实是错误的。它应而说“正确的数据是一种资产,不正确的数据是一个责任”。

和数据库的限制给你最好的保证数据的正确性。

在某些DBMS(例如Oracle)的约束条件可以实际上的提高一些查询的性能,因为优化器可以使用约束,以获得有关的数据的结构的知识。对于一些示例,请参阅此Oracle杂志文章

我会说所有需要的约束必须是在数据库中。外键约束防止无用数据。他们是不是一个不错的 - 他们的要求,除非你想有一个无用的数据库。外键可能会伤害删除和更新的性能,但是这是确定的。它是更好地需要一点时间做删除(或告诉应用程序不要删除这个人,因为他有订单系统)或删除用户,但不是他的数据?缺乏外键可能会导致在查询数据意外,往往严重的问题。例如成本报表可能取决于有相关数据的所有表,并因此可能无法显示重要的数据,因为一个或多个表没有什么可加盟。

唯一约束也任何像样DATABSE的要求。如果字段的字段或组必须是唯一的,失败在数据库LEVE来定义这是一个非常难以解决tocreate数据问题。

您不提其他方面的限制,但你应该。必须始终在表中可以适用于所有数据的任何业务规则应该总是在数据库中通过数据类型应用(如DATATIME数据类型,其willnot接受'02 \ 31 \ 2009' 年为有效日期),约束(比如一个不允许的字段具有大于100的值),或通过一个触发是逻辑是如此复杂它不能由一个普通的约束来处理。 (触发器是棘手写,如果你不知道你在做什么,所以如果你有这样的逻辑复杂,你希望对你的团队adatabase专业)的顺序是非常重要的。数据类型是第一选择,接着约束,随后触发器作为最后的选择。

<强>简单的应用代码

他们提供了一个很好的事情是,你的应用程序代码做少了很多错误检查和验证。对比这些代码两位与数千操作繁衍,你可以看到有一个巨大的胜利。

get department number for employee  # it's good coz of constraints
do something with department number

VS

get department number for employee
if department number is empty
    ...
else if department number not in list of good department numbers
    ....
else
    do something with department number

当然,那些无视约束人可能不会把大量的精力投入到代码验证反正...: - /

哦,如果该数据约束的变化,它是一个数据库配置问题,而不是一个代码变化的问题。

当你使用集成共享数据库若干应用

完整性约束是特别重要的。

您可能能够妥善管理在一个单一的应用程序的代码数据的完整性(即使你不这样做,至少破损数据仅影响该应用程序),而与多个应用它得到毛的(并在至少多余)。

“噢,并且如果数据约束的变化,它是一个数据库配置问题,而不是一个代码变化的问题。”

除非它是从设计中消失的约束。在这种情况下,肯定是有代码的影响,因为有些代码可能已被写入该依赖于删除约束在那里。

这必须始终考虑在考虑当“laxing”或“删除”的任何声明的约束。

除此之外,你是当然完全正确。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top