博客
关于我
2024年大数据最新数据库不推荐使用外键的9个理由!_为什么不建议使用外键,2024年最新大数据开发岗面试
阅读量:801 次
发布时间:2023-04-17

本文共 1445 字,大约阅读时间需要 4 分钟。

为什么数据库不使用外键?

在数据库设计中,外键的使用常常引发争议。尽管外键能够提高数据质量,但它也会对数据库性能产生显著影响。在实际应用中,许多架构师选择不在数据库层面强制执行外键关系,这背后有着深层次的原因。

1. 数据库的批量处理特性

数据仓库和分析数据库处理数据时,通常采用批量方式而非传统的交易方式(一次一行)。这种特性要求数据库在设计时必须具备高性能。外键约束会增加查询的复杂度,影响数据库的插入、更新和删除操作性能。因此,在这些任务之前,数据库需要进行完整性检查,这也是许多架构师和DBA放弃外键的原因之一。

2. 遗留数据处理

许多数据库需要存储来自旧数据库或遗留系统的数据。这些旧数据往往对数据质量和完整性缺乏严格的约束。为了容纳这些脏数据,架构师有两种选择:一是清理和转换遗留数据(这通常是非常耗时且昂贵的操作),另一种是放弃在数据库层面上强制执行外键关系。一些集成型ERP和CRM系统也采取了后者策略。

3. 全表重新加载

某些数据库,如分段数据库或接口数据库,需要定期从外部系统重新加载数据。这种情况下,若在重新加载时保留外键约束,可能会导致数据不一致的问题(例如父表为空而子表已有数据的情况)。为绕开这一问题,许多数据库在重新加载时会禁用外键约束。

然而,这种做法虽然能解决一致性问题,但会引入额外的逻辑复杂性和潜在的失败点。考虑到性能和维护成本的考量,开发人员往往不愿意在外键约束下操作,这也成为不使用外键的另一个原因。

4. 高层次框架和ORM工具

一些应用程序采用了额外的逻辑层,物理数据库上方还建立了一个逻辑数据库层。开发人员通过API或框架完成数据操作,而不是直接使用SQL语句。例如,ORM(对象关系映射)框架或Ruby on Rails框架就属于这种类型。这些工具负责处理数据的完整性,并在后台执行数据库操作。开发人员可以通过这些工具自动生成数据库表结构,而无需手动创建外键关系。

5. 跨数据库关系

在某些架构中,数据库之间存在物理隔离,无法在同一台服务器上创建跨数据库的外键关系。例如,Microsoft SQL Server就不支持在同一台服务器上创建跨数据库的外键。这种架构在大型系统中也非常常见。

6. 数据库平台不可知论者

有些应用程序被设计为对数据库平台完全无关。例如,PeopleSoft(现由Oracle拥有)就要求其设计不依赖特定的数据库平台。为实现这一目标,开发人员将所有逻辑尽可能推移到应用层,而不是依赖数据库层面上的外键约束。

7. 数据库的高度可定制性

一些数据库提供了高度的定制性,允许开发团队在设计时做出灵活的选择。例如,Oracle的电子商务套件就是一个典型的例子。它被设计成能够进行大量定制,支持团队在实施过程中根据具体需求调整数据库结构。

8. 架构师的工作方式

有时候,架构师和数据库管理员对数据库的维护和扩展工作投入过少。虽然外键能够保证数据的一致性,但创建和维护这些约束需要额外的时间和资源。一些团队选择忽略外键约束,以降低开发和维护成本。

9. 数据模型的隐私性

在某些情况下,团队可能选择不公开数据库的详细模型。这可能是出于商业竞争的考虑,或者是为了保护数据的敏感信息。通过不暴露数据库的具体结构,团队可以更灵活地进行系统设计和扩展。

总结

以上是一些主要原因,解释为什么许多数据库选择不在数据库层面强制执行外键关系。无论是性能问题、架构限制,还是团队的工作方式,每个因素都可能影响最终的数据库设计选择。

转载地址:http://cagfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现1000 位斐波那契数算法(附完整源码)
查看>>
Objective-C实现2 个数字之间的算术几何平均值算法(附完整源码)
查看>>
Objective-C实现2d 表面渲染 3d 点算法(附完整源码)
查看>>
Objective-C实现2D变换算法(附完整源码)
查看>>
Objective-C实现3n+1猜想(附完整源码)
查看>>
Objective-C实现3n+1猜想(附完整源码)
查看>>
Objective-C实现9x9乘法表算法(附完整源码)
查看>>
Objective-C实现9×9二维数组数独算法(附完整源码)
查看>>
Objective-C实现A*(A-Star)算法(附完整源码)
查看>>
Objective-C实现A-Star算法(附完整源码)
查看>>
Objective-C实现abbreviation缩写算法(附完整源码)
查看>>
Objective-C实现ABC人工蜂群算法(附完整源码)
查看>>
Objective-C实现activity selection活动选择问题算法(附完整源码)
查看>>
Objective-C实现AC算法(Aho-Corasick) 算法(附完整源码)
查看>>
Objective-C实现adaboost算法(附完整源码)
查看>>
Objective-C实现Adler32算法(附完整源码)
查看>>
Objective-C实现AES算法(附完整源码)
查看>>
Objective-C实现AffineCipher仿射密码算法(附完整源码)
查看>>
Objective-C实现aliquot sum等分求和算法(附完整源码)
查看>>
Objective-C实现all combinations所有组合算法(附完整源码)
查看>>