在数据库中建立关系会使它们变慢

Sye*_*idi 8 database performance foreign-key-relationship

我刚开始在一家小软件公司实习,我正在研究ERP.我的团队负责人禁止我在数据库中创建任何关系.由于这是我的实习,我感到震惊,因为到目前为止我已经读到关系是确保数据完整性所必需的.我的团队负责人告诉我,我们可以在前端强制执行数据完整性.经过一些研究后,我发现外键确实使数据库速度变慢,但索引外键可以提高性能.

问题

  • 如何制作外键性价比?
  • 确保前端的数据完整性不是性价比吗?如果是,那么通过确保前端的数据完整性规则,数据库外键的性能成本和成本之间的差异是什么?
  • 如果数据库外键确实使数据库变慢,并且应用程序层的完整性规则是更好的方法,那么为什么我们的关系数据库允许拥有外键呢?
  • 在做了一些研究和阅读之后,关系确实让db变慢了,我试着想到一个场景,确保应用层的数据完整性是不可能的,但我想不出一个,如果有人可以解释这个,那就太好了.
  • 如果索引外键可以提高性能,那么下面的两个更好:

    1.)确保应用层的数据完整性规则

    2.)索引外键

感谢帮助.

woe*_*ler 7

通常,您的数据模型越复杂,您将体验到的性能命中度就越高.但是,除非您的数据库非常大,您的硬件资源非常少,或者您的查询非常复杂,否则您可能不会因在数据库中添加强制关系而受到阻碍.这显然是一种主观陈述,但"可接受的表现"是一个非常主观的概念,因项目而异.

不过,你同事的论证的核心是正确的,原因如下:

  • 每次编写包含外键或主键的新记录时,数据库都必须检查是否违反了任何键的约束.键列也是索引的,因此在添加记录时必须更新索引.
  • 每次删除包含或引用外键的记录时,都会检查约束,并且删除可能会级联到引用的表.删除记录时,还必须更新索引.
  • 随着越来越多的表在查询中加入,所有类型的CRUD操作都会显着减慢.表越大,必须连接的记录越多,执行速度越慢.

那就是说,这就是为什么这些论点大多无关紧要:

  • 索引显着缩短了查询执行时间,尤其是在实现良好的情况下.以一种利用将针对它运行的查询结构的方式对表进行索引非常重要.
  • 除非您的数据库硬件是简单的,否则强制数据完整性和关系约束所需的操作在后端运行的速度可能比前端快得多.如果在客户端应用程序中发生约束检查而在服务器上发生约束检查,则尤其如此.
  • 基于客户端的数据完整性检查比数据库约束更容易出错.是的,如果你的代码是完美的,那么它也可以运行,但是RDBMS软件是专为这类事物设计的,实现起来非常简单.
  • 基于客户端的数据完整性检查可能导致数据同步问题.想想在不同地点的两个人试图修改一个独特的记录.但是,如果闪电般快速的速度是您最关心的问题,那么最终的数据并发性就足够了.

这些都取决于您的RDBMS和项目的规范,但这是很好的经验法则.一般来说,我会说,除非您的数据库太大以至于执行关系变得非常慢,或者您的模型非常简单以至于关系毫无意义(在这种情况下,您为什么使用RDBMS?),最好启用数据完整性和关系约束.