数据库设计要不要外键?

小星宇 2018-03-06 10:59:13
正在做毕业设计——网上求职招聘网站,刚开始建数据库,有点迷茫,使用的是mysql数据库,外键究竟是使用还是不使用?越想越困惑。。。想请教各位
...全文
1585 40 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_40290083 2019-08-24
  • 打赏
  • 举报
回复
关系型数据库的关系就是通过主外键实现的,从数据的意文来讲没有多大意文,要保证数据的一致性,完整性,不冗余,那么主外键就必须有。越是复杂的业务,数据结构也必然复杂。越能体现主外键的好处,即使你不使用主外键,也有可能你要在自己的业务逻辑中自己实现对应关系
weixin_45270271 2019-08-23
  • 打赏
  • 举报
回复
如果你想操作多张表,那就要了,建立关系要的
编程写手 2019-08-14
  • 打赏
  • 举报
回复
建议不要用外键,外键就是一个约束,有的时候只要懂的表之间的关系,能省外键就省。有的时候不用外键是有好处的
皮皮熊_1989 2019-08-14
  • 打赏
  • 举报
回复 1
我来做个综合回答吧: 在大学学习的时候,为了让学生掌握表与表之间的关系和缜密的逻辑性,都会让在数据库设置外键约束,出发点是好的。 但在实际开发的过程中,1. 我们的需求经常变动,如果设立了外键约束,很多时候表不好改,牵一发动全身; 2. 互联网项目,尤其是高并发和很多用户的项目,过多设置外键约束,会严重影响数据库的性能,因为一些级联删除、更新等,都是数据库自己去做的。假设修改的表数据量超大,那么效率可想而知; 3. 一般来说,我们都是在应用层(不需要同一事务)或者数据交互层(同一事务,一个不成功全部回滚)从逻辑上去达到类似外键约束的效果; 4. 很多时候,外键约束的级联行为,不满足实际需要,比如:我删除一个数据,用这个数据的主键为外键并建立了外键约束级联删除时这个相关的数据都会被同时删除,可实际上,我们很多项目需要查看一些历史性的数据。比如,你去年买了个商品,商品类型是A,而今年这个A被删除了,但我还是需要知道去年我买的什么。 一般这种情况,数据库会有额外的字段作为逻辑删除字段,多半是bit类型的,如:is_deleted等标记是否逻辑删除。然后取数据的时候,自动通过sql或者EF的where过滤掉is_deleted=true的数据(一般来说,主表过滤,连接表一般不过滤。当然,实际业务为准)。 至于说外键省代码量,其实就是级联产生的效果。 综上,实际开发中,设数据库的外键约束,绝对绝对的弊大于利,一般都不设。
健者天行 2018-03-08
  • 打赏
  • 举报
回复
外键列需要, 外键关联约束可以不需要。
cattpon 2018-03-08
  • 打赏
  • 举报
回复
不需要~毕设要求不高
  • 打赏
  • 举报
回复
根据情况定啊,再说毕业设计和公司项目不一样
技乐书香 2018-03-07
  • 打赏
  • 举报
回复
互联网项目现在一般都不加外键,外键会导致子表的更新操作对父表产生锁,非常影响数据库的性能
李逍遥丶 2018-03-07
  • 打赏
  • 举报
回复
设置外键为数据库增加压力,现在的事务一般都在java里面处理
  • 打赏
  • 举报
回复
我之前做的一个国际电信业务,表全部都有外键,删除某条数据的时候,java必须先判断关联这条记录的数据有没有被删除(物理删除)。 后来在另一家公司做的一个仿淘宝的商城,表没有外键,数据管理又不严格,属于那种开发人员随意可以动生产数据那种(比如直接从库中删除某条数据),结果经常造成数据有问题。 现在做的公司某国有大型电商运维系统,数据逻辑删除,从页面上部分删除数据的时候,有的做校验,有的不做校验,不过问题不大。 我建议你开发的时候,还是遵循数据库三范式(虽然实际中并不全都适用,但至少在学习中知道怎么回事并会用,不要跟培训出来的一样只会用方法,不知其所以然),加外键,以后工作了按规定来就行了。
xiayiguo 2018-03-07
  • 打赏
  • 举报
回复
我们项目都不设置外键,没有必要
懒笑翻 2018-03-07
  • 打赏
  • 举报
回复
现在不怎么用外键了的 我们公司写项目都是直接列相关联 不直接设置外键
bzchao 2018-03-07
  • 打赏
  • 举报
回复
有其他参照表就需要外键
Fly天夏 2018-03-07
  • 打赏
  • 举报
回复
我建议不要用外键,业务控制好就ok
stronger35 2018-03-07
  • 打赏
  • 举报
回复
阿里JAVA开发手册建议不要使用外键
xiaoxiangqing 2018-03-07
  • 打赏
  • 举报
回复
看实际情况,一般是需要
hovoy 2018-03-07
  • 打赏
  • 举报
回复
外键又好又不好啊。两面性。
nettman 2018-03-07
  • 打赏
  • 举报
回复
关注,学习
java夜洛 2018-03-07
  • 打赏
  • 举报
回复
这个要分情况,我们现在做的项目就没有设置外键。 说明:(概念解释)学生表中的 student_id是主键,那么成绩表中的 student_id则为外键。 如果更新学生表中的 student_id,同时触发成绩表中的 student_id更新,则为级联更新。 外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数 据库更新风暴的风险;外键影响数据库的插入速度。
绝望星空 2018-03-07
  • 打赏
  • 举报
回复
真正的项目一般都不用外键
加载更多回复(19)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧