实际开发中,是否会在数据库表中设置外键?
来源:互联网 发布:蜗蜗网络董事长秀才 编辑:程序博客网 时间:2024/06/05 11:26
本科学习数据库的时候,书上明确的写了对于多对多关系必须要创建外键,可是最近在跟师兄做一个B/S架构的项目,发现所设计的数据库表虽然是多对多关系但并没有要求外键,查了一下之后才发现目前的大型系统中(尤其是互联网的大型项目)不会有外键这种东西,在这里总结一下以供今后学习。
原文地址
设计数据库时是否采用外键取决于业务应用场景,以及开发成本,也就是说对于这个问题并没有绝对的答案。
- 应用场景的比较 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水平扩展;若是把数据一致性的控制放到事务中,也即让应用服务器承担此部分的压力,而引用服务器一般都是可以做到轻松地水平的伸缩;
传统行业(软件使用人数可控)的可以使用外键。- 外键的性能问题
1.数据库需要维护外键的内部管理;
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;历史背景:
数据库的诸多设计,帐号,权限,约束,触发器,都是为 C/S 结构设计的,是以 C 端不可信做为假设前提的。B/S 模式安全边界前移到 web 服务层,应用与数据库之间是可信的,应用自行完成这些功能更加灵活。
总结:
在大型互联网项目中不使用外键,是为了系统的性能,但这并不代表没有实现实现表与关联表之间的数据一致性和更新,只不过是在业务层对此做了限制,确保由Service到Dao再到Service都是符合数据库规范的,与使用外键的作用是相同的,但这样做可以进一步提升系统性能。
在本科学习的时候,老师确实强调要写外键,但在实际开发中情况往往是除了主键和非空约束外,其他的都不要,主要通过程序来控制外键关联!因此,实践和理论还是有差别的,但有一点却是不变的,那就是无论理论还是实践都是用来为实际需求服务的,也就是说“怎么好怎么来,要因时制宜,灵活变通。”
阅读全文
1 0
- 实际开发中,是否会在数据库表中设置外键?
- 表是否在数据库中,字段是否存在表中
- 数学在实际应用中会显得更美
- javap 如何应用在实际开发中
- 在实际开发中遇到的问题?
- Java 数据类型在实际开发中应用
- android在实际的应用程序开发中,我们有时需要把 Activity 设置成全屏显示
- 数据库设计的14个技巧--在实际开发中,注意运用体会吧
- 实际开发中LayoutInflater
- 查看在数据库中实际执行时的解析计划
- 浅谈实际开发中数据源在JDBC中的应用
- 浅谈实际开发中数据源在JDBC中的应用
- 如何在实际项目开发中使用LinQ技术
- log4j在实际开发中应用场合的一些"潜规则"
- Webview在实际开发中比较实用资料
- 【沙龙干货】如何在实际工程中使用Swift开发?
- 在java项目的实际开发和应用中
- Android之Volley框架在实际开发过程中运用
- 什么时候用delete[]和delete
- D
- 变量的初始化C++新特性
- CentOS 通过yum在线安装MySQL5.7
- HDU 2063 过山车 :二分匹配入门题
- 实际开发中,是否会在数据库表中设置外键?
- 程序的机器级表示(2)--IA32汇编代码
- 使用 Spark MLlib 做 K-means 聚类分析
- hdu2222 Keywords Search ac自动机
- dynamic_cast和 static_cast的区别
- Android动画之Tween动画
- scala创建并使用Enumerations
- Sublime Text 3配置php语法错误提示插件PHPCS
- hihoCoder1319 岛屿周长 (bfs)