`
dannyhz
  • 浏览: 392871 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

外键的必要性

    博客分类:
  • DB
 
阅读更多
引用



平常需要使用外键吗?
数据库的诸多设计,帐号,权限,约束,触发器,都是为 C/S 结构设计的,是以 C 端不可信做为假设前提的。B/S 模式安全边界前移到 web 服务层,应用与数据库之间是可信的,应用自行完成这些功能更加灵活。所以能不用就不用

1. 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水平扩展;若是把数据一致性的控制放到事务中,也即让应用服务器承担此部分的压力,而引用服务器一般都是可以做到轻松地水平的伸缩;

2.数据库服务器的性能不是问题,所以不用过多考虑性能的问题;另外,使用外键可以降低开发成本,借助数据库产品自身的触发器可以实现表与关联表之间的数据一致性和更新;最后一点,使用外键的方式,还可以做到开发人员和数据库设计人员的分工,可以为程序员承担更多的工作量;
为何说外键有性能问题:
1.数据库需要维护外键的内部管理;
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;



知乎的回答
https://www.zhihu.com/question/46739040


个人理解:多方面来考虑。不加外键肯定会提高性能,但是提升如何还得看具体场景。后台应用程序一般情况是可以做到满足外键的一些约束条件。但是极端情况,以及多团队多模块协作的时候,并不能保证这一点。数据一致性要求高,用外键业务逻辑比较复杂,团队,模块复杂,用外键数据量大,不用外键数据删除更改插入频率高,不用外键




我的数据库设计上基本不会用外键约束,关联关系交给程序处理,这样比较灵活


MySQL对外键支持不好,所以可以不加,但是数据库实体图上一定要画好。


学院派会告诉你在设计的时候把应该有的约束都加上
而实践派得出的结论是主键一定加,非空约束尽量加,外键最好依赖于程序逻辑,而不是数据库,从而更好的拥抱变化,快速响应,数据库也会有相对较好的性能
分享到:
评论

相关推荐

    Oracle定义约束 外键约束

    本文将详细介绍如何在Oracle数据库中使用**外键约束**来确保数据的参照完整性。 #### 二、什么是外键约束 外键约束是一种用于保证两个表之间数据一致性的机制。当两个表存在关联时,通过在外键表(子表)中设置外键...

    MySQL删除表的时候忽略外键约束的简单实现

    在MySQL数据库管理中,删除表是一项需要谨慎操作的任务,尤其...了解如何在必要时安全地禁用外键检查,可以帮助开发者更高效地进行数据库维护工作。同时,也要记得在完成操作后重新启用外键检查,以保持数据的完整性。

    数据一致性守护者:MySQL外键约束深度解析

    ### 数据一致性守护者:MySQL 外键约束深度解析 #### 引言 在现代软件开发中,特别是Web应用程序领域,数据库扮演着...无论是对于初学者还是经验丰富的开发者来说,深入理解并熟练掌握外键约束的应用都是十分必要的。

    深入mysql外键关联问题的详解

    首先,了解外键的定义是非常必要的。在关系型数据库中,外键(Foreign Key)是表中一个字段或一组字段,它引用了另一个表的主键(Primary Key)。外键的作用是保证关联数据的引用完整性。简单来说,外键可以防止在子...

    Oracle批量执行sql语句之禁用所有表的外键

    在这种情况下,禁用所有表的外键约束就显得非常有必要。 首先,让我们了解一下如何在Oracle中批量禁用所有表的外键约束。这通常涉及到三个主要步骤: 1. **删除所有外键约束**:虽然在实际操作中我们可能并不需要...

    为什么在创建php网站时在mysql数据库表中使用外键?

    因此,合理设计数据库模式和谨慎使用外键是必要的。 在实际的PHP开发中,使用MySQL和外键配合,可以构建出更加健壮的Web应用程序。例如,通过ORM(对象关系映射)工具如Doctrine或Eloquent,可以方便地处理这些...

    对django 2.x版本中models.ForeignKey()外键说明介绍

    当不提供 `on_delete` 参数时,如 `owner = models.ForeignKey(User)`,会引发 `TypeError`,提示缺少必要的参数 `on_delete`。解决这个问题的方法是在外键定义时指定 `on_delete`,例如 `owner = models.ForeignKey...

    陈俊潼_10185101210_Homework21

    2.4 唯一标识符的必要性 主键应当能够唯一识别每个实例。对于教师(Teacher)这样的实体,仅仅使用名字(name)作为主键是不够的,因为可能存在同名的教师。因此,通常需要一个额外的字段(如ID)来确保唯一性。 ...

    探讨SQL Server数据库中空值处理技巧

    在 SQL Server 中,外键约束是用于确保数据的一致性和完整性的一个重要机制。然而,空值可能会导致外键约束的不确定性。为了解决这个问题,我们可以使用 ISNULL 函数将空值替换成一个默认值,从而避免外键约束的不...

    数据库表设计参照表.doc

    - 附件(Accessory):可能重复了UploadDate表的信息,需要确认其必要性。 在设计数据库时,要注意以下最佳实践: - 数据类型的选择应尽可能简洁明了,例如,密码通常存储为哈希值而非明文。 - 避免冗余字段,如...

    一对一关联

    2. **共享主键**:两个表的主键相同,形成自然的一对一关联,这种情况下,外键不是必要的,因为主键本身就是连接两表的桥梁。 3. **逻辑上的独立实体**:虽然两个实体在逻辑上是独立的,但在业务上它们保持着一对一...

    北大青鸟系统架构

    这个层处理由表现层传递过来的请求,执行必要的计算、验证和业务决策,然后将结果返回给表现层。例如,如果用户提交了一个订单,业务逻辑层会检查库存、计算价格、处理支付等。 3. 数据访问层(Data Access Layer)...

    《DBMS中语义的完整性》[归类].pdf

    首先,实施数据完整性的必要性源于数据库需要准确反映现实世界的需要。用户在编写数据库应用程序时,通常需要对插入、删除和修改操作添加完整性检查代码,这称为前端验证。然而,这种方法效率低下,容易出错,而且...

    学生实习管理系统需求分析报告

    同时,数据库物理设计应考虑表间的约束关系,如外键,以保证数据的一致性和完整性。 综上所述,学生实习管理系统是一个综合性的管理平台,涉及到学生、教师、企业和系统管理员等多个角色,通过高效的数据管理和交互...

    设备管理系统 数据库设计说明书.doc

    主键和非空值约束确保了数据的唯一性和必要性。例如,设备表和用户表的主键分别是设备号和用户名,以保证每个设备和用户都能被唯一识别。外键约束则用于维护表间关系的完整性,确保数据的一致性。数据库中的各个表,...

    数据库设计文档1

    这些设计展示了数据库如何组织和管理不同类型的数据,以及如何通过外键来维护数据的一致性和完整性。同时,也考虑到了数据的扩展性和查询效率,比如评论的多级结构和点赞统计。这样的设计对于一个包含用户交互、信息...

    SQL Server 2000在数据规划过程中的数据完整性实现 (1).pdf

    例如,在执行插入(INSERT)、更新(UPDATE)或删除(DELETE)操作时,可以编写触发器来检查操作是否违反了数据完整性规则,并在必要时进行阻止或回滚事务。 以上介绍了SQL Server 2000中的数据完整性实现机制,它们是...

    数据库设计的十四个技巧

    8. 数据冗余认知:主键和外键在不同表中的复现并非数据冗余,而是保持数据关联的必要。真正的冗余是指不必要的重复数据,可能导致数据不一致。 除此之外,数据库设计还需考虑其他因素,如索引策略、事务处理、安全...

    SQL SERVER数据完整性及约束.pdf

    在SQL Server中,存在六种常用的数据完整性约束:空值约束(NULL)、唯一性约束(UNIQUE)、主键约束(PRIMARY KEY)、外键约束(FOREIGN KEY)、检查约束(CHECK)和默认约束(DEFAULT)。每一种约束都是用来保证...

    Scripts.rar

    这些脚本可能涵盖了一系列数据库操作,如错误修复、数据一致性检查、主键和外键异常处理以及备份和恢复策略。在SQL Server环境下,这类脚本对于数据库管理员和开发人员来说是至关重要的工具。 描述中提到的...

Global site tag (gtag.js) - Google Analytics