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

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

问题

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

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

2.)索引外键

感谢帮助.

解决方法

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

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

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

也就是说,这就是为什么这些论点大多无关紧要的原因:

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

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

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...